mysql use db后很卡解决

页面导航:首页 > 数据库 > Mysql > mysql use db后很卡解决

mysql use db后很卡解决

来源: 作者: 时间:2016-02-21 09:46 【

mysql use db后很卡解决 平时自己使用的一台mysql,use db之后,总是感觉很卡,按完回车要快1s才能返回。觉得有什么蹊跷,就打开了general log,发现简单的use test,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选项。
 
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<