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選項。