No MySQL 8.0.33, estou enfrentando uma forma de contenção (reproduzida em múltiplas instâncias) que não é explicada pela documentação.
Como exemplo:
- Eu inicializo uma instância
- em um cliente de console, invoco a
SELECT COUNT(*)
em uma tabela relativamente grande (alguns GBs de registros + índices totais) - em um cliente separado, invoco a
ANALYZE TABLE
em uma tabela menor e separada
o resultado é que a segunda instrução ( ANALYZE TABLE
) fica suspensa por um tempo, bloqueada em um System Lock
estado; este é um exemplo de saída:
+----+--------+------+-------+---------+------+-------------+---------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+--------+------+-------+---------+------+-------------+---------------------------------+
| 18 | _user_ | _ip_ | _db_ | Query | 72 | executing | SELECT COUNT(*) FROM _table_1_ |
| 32 | _user_ | _ip_ | _db_ | Query | 45 | System lock | ANALYZE TABLE _table_2_ |
+----+--------+------+-------+---------+------+-------------+---------------------------------+
Com base na documentação ( aqui e aqui ), o MySQL parece estar bloqueando (pelo menos) ambas as tabelas enquanto pagina os registros das primeiras ( SELECT
).
O que exatamente está fazendo com que o MySQL bloqueie várias tabelas enquanto executa um SELECT em uma?