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.