Atualmente o MySQL só suporta bloqueios de tabela para tipos
ISAM
/MyISAM
e
HEAP
, bloqueios a nível de página para
tabelas BDB
e bloqueio a nivel de registros
para tabelas InnoDB
. See
Secção 5.3.1, “Como o MySQL Trava as Tabelas”. Com tabelas
MyISAM
pode se misturar livremente
INSERT
e SELECT
sem travas,
se as instruções INSERT
s não são
confiltantes. (ex.: se eles são inseridos no fim da tabela em vez
de preencherem espaços liberados por dados/linhas deletados).
A partir da versão 3.23.33, você pode analisar a contenção do
bloqueio de tabela no seu sistema verificando as variáveis de
ambiente Table_locks_waited
e
Table_locks_immediate
.
Para decidir se você quer usar um tipo de tabela com bloqueio a nível de registro, você deverá olhar o que o aplicativo faz e o qual é o padrão de seleção/atualização dos dados.
Pontos a favor do bloqueios de registros:
Poucos conflitos de bloqueios ao acessar registros diferentes em muitas threads.
Poucas alterações para rollback.
Torna possível bloquear um único registro por um longo tempo.
Contras:
Gasta mais memória que bloqueios a nível de página ou tabela.
É mais lento que bloqueios a nível de página ou tabela quando usado em uma grande parte da tabela, pois deve-se fazer muito mais travamentos.
É difinitivamente muito pior que outras travas se você
frequentemente utiliza GROUP BY
em uma
grande parte dos dados ou é feita uma varredura de toda a
tabela.
Com nível de bloqueios mais altos pode-se também, com mais facilidade, suportar travas de diferentes tipos para sintonizar a aplicação já que a sobreposição de bloqueio é menos perceptível que para bloqueios a nível de registro.
Bloqueios de tabela são superiores a bloqueios a nível de página / registro nos seguintes casos:
Muitas leituras
Leituras e atualizações em chaves restritas; é onde atualiza ou deleta-se um registro que pode ser buscado com uma leitura de chave:
UPDATE nome_tbl SET coluna=valor WHERE unique_key# DELETE FROM nome_tbl WHERE unique_key=#
SELECT
combinado com
INSERT
(e muito poucas instruções
UPDATE
s e DELETE
s).
Muitas varreduras / GROUP BY
em toda a
tabela sem nenhuma escrita.
Outra opções além de bloqueios a nível de página / registro:
Versioning (como usamos no MySQL para inserções concorrentes) onde você pode ter um escrita e várias leituras ao mesmo tempo. Isto significa que o banco de dados/tabelas suporta diferentes viiews para os dados dependendo de quando se começa a acessá-lo. Outros nomes deste recurso são time travel, cóia na escrita ou cópia por demanda.
Cópia por demanda é em muitos casos muito melhor que bloqueio a nível de registro ou página; o piro caso, no entanto, usa muito mais memória que a usada em travamentos normais.
Em vez de se usar bloqueio de registro pode-se usar bloqueios no aplicativo (como get_lock/release_lock no MySQL). Isto só funciona em aplicaticos bem comportados.
Em muitos casos pode se fazer um palpite sobre qual tipo de bloqueio é melhor para a aplicação. mas geralmente é muito difícil dizer que um dado tipo de bloqueio é melhor que outro; tudo depende da aplicação e diferentes partes da aplicação podem exigir diferentes tipos de bloqueios.
Aqui estão algumas dicas sobre travamento no MySQL:
A maioria das aplicações web fazem diversos selects, muito poucas deleções, atualizaoes principalmente nas chaves e inserções em tabelas específicas. A configuração base do MySQL é bem sitonizada para esta finalidade.
Usuários concorrentes não são um problema se eles não misturam atualizações com seleções que precisam examinar muitas linhas na mesma tabela.
Se é misturado inserções e exclusões na mesma tabela então
INSERT DELAYED
pode ser de grande ajuda.
Pode se também usar LOCK TABLES
para aumentar
a velocidade (muitas atualizações com um travamento simples é
muito mais rápida que atualizações sem travamento). Separar as
coisas em tabelas diferentes também ajudará.
Se você tiver problemas de velocidade com travamento de tabelas
no MySQL, você pode estar apto a resolver isto convertendo alguma
de suas tabelas para tipos InnoDB
ou
BDB
. See Secção 7.5, “Tabelas InnoDB
”. See
Secção 7.6, “Tabelas BDB
ou BerkeleyDB
”.
A seção de otimização no manual cobre diversos aspectos de como sintonizar a sua aplicação. See Secção 5.2.13, “Mais Dicas sobre Otimizações”.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.