As tabelas bloqueadas do MySQL afetam as visualizações relacionadas?
-
26-09-2019 - |
Pergunta
Então, depois de ler Desempenho em PDO / PHP / MySQL: transação versus execução direta Em relação a questões de desempenho, eu estava pensando em fazer algumas pesquisas sobre bloqueio de mesas no MySQL.
Sobre http://dev.mysql.com/doc/refman/5.0/en/table-locking.html
O bloqueio da tabela permite que muitas sessões leiam a partir de uma tabela ao mesmo tempo, mas se uma sessão quiser escrever em uma tabela, ele deve primeiro obter acesso exclusivo. Durante a atualização, todas as outras sessões que desejam acessar esta tabela específica devem esperar até que a atualização seja concluída.
Essa parte me impressionou principalmente porque a maioria de nossas consultas serão atualizações, em vez de inserções. Fiquei me perguntando se alguém criou uma tabela chamada Foo na qual todas as atualizações/inserções foram realizadas e depois uma visualização chamada Foo_View (uma cópia de Foo, ou talvez Foo e um vínculo de várias outras tabelas mais foo) nas quais todas as seleções ocorreram, Esse problema de travamento ainda ocorreria?
Ou seja, selecionariam consultas no foo_view ainda precisariam esperar que uma atualização termine no Foo?
Outra breve pergunta que meu colega fez. Isso afeta o cache? Ou seja, se a seleção for armazenada em cache, ele atingirá o cache e retornará os resultados, ou esperará que o bloqueio termine primeiro?
Solução
Sua visão experimentará o mesmo bloqueio que as tabelas subjacentes.
Na página de referência MySQL em travando:
O MySQL concede a tabela, escreva bloqueios da seguinte forma:
- Se não houver fechaduras na mesa, coloque uma trava de gravação nela.
- Caso contrário, coloque a solicitação de bloqueio na fila de bloqueio de gravação.
MySQL Grants Table Read Locks da seguinte forma:
- Se não houver fechaduras de gravação na mesa, coloque um bloqueio de leitura nela.
- Caso contrário, coloque a solicitação de bloqueio na fila de bloqueio de leitura.
Vale ressaltar que isso depende do mecanismo de banco de dados que você está usando. Myisam seguirá as etapas acima e bloqueará a tabela inteira (mesmo que seja dividida em várias partições), onde um motor como Innodb fará o bloqueio no nível da linha.
Se você não está atingindo os benchmarks de desempenho necessários com o Myisam e mostrou que seu gargalo está esperando nos bloqueios de mesa por meio de atualizações, sugiro alterar o mecanismo de armazenamento da sua tabela para Innodb.