Para um determinado projeto, parece que o comando use <database>;
leva um tempo extraordinariamente longo (geralmente um minuto ou mais). (Este parece ser o caso em algumas instâncias diferentes em diferentes versões do MySQL (5.3 e 5.5, eu acho)). Entendo que isso é causado pela Tabfuncionalidade completa e estou ciente de que poderia usar apenas um sinalizador -A, mas estou interessado na causa desse atraso.
Meu primeiro palpite foi que isso tem a ver com a velocidade de INFORMATION_SCHEMA
, e que o grande número de colunas causou um atraso, mas em 4,7k colunas (580 tabelas em ~ 8 colunas por tabela), isso parece um pouco exagerado. Existem 3,6 mil índices, mas isso não me parece uma causa provável do problema.
Você praticamente acertou em cheio.
Se o
use
comando resultar em uma alteração do banco de dados padrão, o cliente MySQL se ramificará embuild_completion_hash()
.Desde que o cliente não tenha sido iniciado com a
-A
opção , essa função:hashes todos os comandos SQL ;
executa
show databases
e faz hash dos resultados ;executa
show tables
e faz hash dos resultados ; epara cada tabela , chama
mysql_list_fields()
e faz hash dos resultados .Portanto, no seu caso, ele está fazendo 582 solicitações de banco de dados separadas (uma para cada uma das etapas 2 e 3; e 580 para a etapa 4), repetindo os resultados de cada uma. Ai.
Claro, teria sido muito mais sensato fazer (ou pelo menos a primeira tentativa de fazer) um single,
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
mas não cabe a nós ponderar por que…Há algumas possibilidades em que posso pensar:
Carregar os dados de preenchimento automático leva muito tempo porque você tem um esquema com um número muito grande de tabelas e colunas. Transmitir isso nem sempre é muito eficiente, então, como você observou, -A pode ajudar. A conexão com o banco de dados principal é lenta
mysql
?Caso contrário, talvez o MySQL esteja em repouso e precise de um momento para girar e se preparar para suas solicitações, embora isso deva significar que uma segunda conexão é muito mais rápida. Depois que os caches estiverem aquecidos, o que inclui o cache de disco no nível do sistema operacional, ele deverá ter um desempenho melhor. Em um sistema com pouca carga, esse será frequentemente o caso.