Acabamos de descobrir a innodb_stats_on_metadata
configuração , que parece Faça o truque. Desativa o mergulho do InnoDB nos índices para obter contagens aproximadas.
Temos várias centenas de tabelas InnoDB em um banco de dados e usamos o phpMyAdmin para gerenciá-las. Infelizmente, o phpMyAdmin faz uma consulta SHOW TABLE STATUS
sempre que a lista de tabelas é mostrada, e isso parece cavar em cada tabela InnoDB para obter uma contagem aproximada de linhas.
Isso parece bloquear todo o banco de dados, o que subseqüentemente significa que todas as outras consultas a esse banco de dados (ocupado) enfileiram até que o banco de dados atinja os usuários máximos.
SHOW TABLE STATUS
pode ser acelerado de uma maneira razoável? SHOW TABLE STATUS
completa, ou pelo menos não bloquear todo o banco de dados de uma só vez? Acabamos de descobrir a innodb_stats_on_metadata
configuração , que parece Faça o truque. Desativa o mergulho do InnoDB nos índices para obter contagens aproximadas.
SHOW TABLE STATUS
não bloqueia tabelas - pelo menos, eu certamente nunca encontrei isso. Além disso, a contagem de linhas para InnoDB em SHOW TABLE STATUS
é apenas uma estimativa, então definitivamente não está fazendo um COUNT(*)
ou equivalente moral. O que você recebe de um SHOW PROCESSLIST
enquanto o SHOW TABLE STATUS
está sendo executado?
Uma possibilidade para investigar: seu table_open_cache
pode ser muito pequeno, fazendo com que você fique preso fechando e reabrindo muitas tabelas durante a execução da sua consulta de status.