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?

Foi útil?

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:

  1. Se não houver fechaduras na mesa, coloque uma trava de gravação nela.
  2. Caso contrário, coloque a solicitação de bloqueio na fila de bloqueio de gravação.

MySQL Grants Table Read Locks da seguinte forma:

  1. Se não houver fechaduras de gravação na mesa, coloque um bloqueio de leitura nela.
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top