Por que o bloqueio no nível da mesa é melhor do que o bloqueio no nível da linha para mesas grandes?

StackOverflow https://stackoverflow.com/questions/3462643

  •  27-09-2019
  •  | 
  •  

Pergunta

De acordo com Manual MySQL:

Para mesas grandes, o bloqueio de mesa geralmente é melhor do que o bloqueio de linha,

Por que é isso? Presumo que o bloqueio no nível da linha seja melhor porque, quando você trava em uma tabela maior, está bloqueando mais dados.

Foi útil?

Solução

do (pré-edit) link

Mais lento que bloqueios no nível da página ou no nível da mesa quando usado em grande parte da tabela porque você deve adquirir muito mais bloqueios

Use um bloqueio de nível de linha se estiver atingindo apenas uma ou duas fileiras. Se o seu código atingir muitas linhas ou desconhecidas, fique com a trava da tabela.

Outras dicas

  • O bloqueio de linha precisa de mais memória do que o bloqueio do nível da tabela ou da página.

  • Tem que adquirir muito mais bloqueios com bloqueio de linha, o que gasta mais recursos

A partir de http://www.devshed.com/c/a/mysql/mysql-optimization-part-2/

  • Vantagens do bloqueio de nível de linha:

    • Menos conflitos de bloqueio ao acessar linhas diferentes em muitos threads.
    • Menos alterações para reversões.
    • Torna possível bloquear uma única linha por muito tempo.
  • Desvantagens do bloqueio no nível da linha:

    • Leva mais memória do que bloqueios no nível da página ou no nível da mesa.
    • É mais lento que os bloqueios no nível da página ou no nível da mesa quando usado em grande parte da tabela, porque você deve adquirir muito mais bloqueios.
    • É definitivamente muito pior do que outras bloqueios, se você costuma agrupar por operações em grande parte dos dados ou se você costuma escanear a tabela inteira.
    • Com bloqueios de nível superior, você também pode suportar mais facilmente bloqueios de diferentes tipos para ajustar o aplicativo, porque a sobrecarga de bloqueio é menor do que para bloqueios no nível da linha.
  • Os bloqueios da tabela são superiores aos bloqueios no nível da página ou no nível da linha nos seguintes casos:

    • A maioria das declarações para a tabela são leituras.
    • Leia e atualiza as teclas rigorosas, onde você atualiza ou exclua uma linha que pode ser buscada com uma única chave de leitura:UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
    • Selecione combinado com instruções de inserção simultânea e muito poucas instruções atualizadas e excluídas.
    • Muitas varreduras ou grupo por operações em toda a tabela sem escritores.

UMA fileira O bloqueio do nível da tabela é melhor para uma tabela grande onde as principais modificações de dados estão ocorrendo. Isso permite que o sistema lide com uma única trava na mesa, em vez de ter que lidar com um bilhão de bloqueios (um para cada linha).

O RDBMS aumenta automaticamente os níveis de bloqueio internamente.

O travamento da tabela permite que muitas sessões leiam de uma mesa ao mesmo tempo

Para alcançar uma velocidade de bloqueio muito alta, o MySQL usa travamento de tabela

"Eu presumiria que o bloqueio no nível da linha é melhor porque" [você bloqueia menos dados].

O primeiro "melhor" é mal definido nesta página. Parece que melhor significa "mais rápido".

O bloqueio no nível da linha não pode (em geral) ser mais rápido por causa da disputa por bloqueios. Bloquear cada linha de um grande conjunto de resultados significa a possibilidade muito real de um conflito com outra consulta de grande conjunto de resultados e uma reversão.

Em geral, se você precisar bloquear muitos dados, 1 bloqueio em uma mesa grande é mais barato do que um monte de nível de linha ou bloqueios de página

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