mysql use db 后很卡

    平时自己使用的一台mysql,use db之后,总是感觉很卡,按完回车要快1s才能返回。觉得有什么蹊跷,就打开了general log,发现简单的use test,mysql实际执行了很多内容:

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。

 

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内容即为表名);

     auto-rehash有什么作用呢?简言之就是,自动补全,当你输入schema/table的前面几个字符后,按tab键,mysql会做提示你可能的输入。

       因此在被use的schema下的表比较多的时候,自然会显得有些卡了(连续use同样的schema,则第二次use,则只会有COM_QUERY和COM_INIT_DB的过程), 为了避免use db后很卡,my.cnf里加上 no-auto-rehash;或者用mysql client连接的时候加上-A选项。

 

参考链接:

http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html#option_mysql_auto-rehash

 

猜你喜欢

转载自guduwhuzhe.iteye.com/blog/1880903
今日推荐