欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql use db后很卡解决_MySQL

程序员文章站 2022-05-15 08:29:30
...
bitsCN.com

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
相关标签: mysql