mysql use db后很卡解决
平时自己使用的一台mysql,use db之后,总是感觉很卡,按完回车要快1s才能返回。觉得有什么蹊跷,就打开了general log,发现简单的use test,mysql实际执行了很多内容:
sql代码
130603 16:02:11 2 query select database()
2 init db test
2 query show databases
2 query show tables
2 field list b
2 field list bmw
2 field list http_auth
2 field list perf_machine
2 field list t
2 field list t1
2 field list t2
2 field list t5
2 field list t_max_col
2 field list tb
2 field list tbcsv
2 field list tbmemory
2 field list tbmyisam
2 field list tc
2 field list total
2 field list tt
而简单的show tables,show databases, select database(),show tables from test,实际都只对应一条generallog。
sql代码
130603 16:17:12 2 query show tables
130603 16:17:28 2 query show databases
130603 16:17:48 2 query select database()
130603 16:19:44 3 query show tables from test
从general log可以看到 一条use test,实际执行了多次dispatch_command(),使用gdb对general_log_write()设置断点,实际执行如下:
com_query,对应的sql是 select database(),调用路径为:handle_one_connection(sql_connect.cc)->do_command(sql_parse.cc)->dispatch_command(sql_parse.cc,command=com_query,packet=select database());
com_init_db,调用路径为:handle_one_connection(sql_connect.cc)->do_command(sql_parse.cc)->dispatch_command(sql_parse.cc,command=com_init_db,packet=test);
com_query,对应的sql是 show databases,调用路径为:handle_one_connection(sql_connect.cc)->do_command(sql_parse.cc)->dispatch_command(sql_parse.cc,command=com_query,packet=show databases);
com_query,对应的sql是show tables,调用路径为:handle_one_connection(sql_connect.cc)->do_command(sql_parse.cc)->dispatch_command(sql_parse.cc,command=com_query,packet=show tables);
com_field_list,调用路径为:handle_one_connection(sql_connect.cc)->do_command(sql_parse.cc)->dispatch_command(sql_parse.cc,command=com_field_list,packet=columns_priv)。此处是n次调用(n为被use的schema下的表的个数,每次调用的时候,pachet内容即为表名);
因此在被use的schema下的表比较多的时候,自然会显得有些卡了(连续use同样的schema,则第二次use,则只会有com_query和com_init_db的过程), 为了避免use db后很卡,my.cnf里加上 no-auto-rehash;或者用mysql client连接的时候加上-a选项。
bitscn.com
