AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 21075
Accepted
32bitfloat
32bitfloat
Asked: 2012-07-17 02:23:49 +0800 CST2012-07-17 02:23:49 +0800 CST 2012-07-17 02:23:49 +0800 CST

maneira de evitar que as consultas esperem pelo bloqueio no nível da tabela

  • 772

Encontramos um problema após mover o banco de dados de nosso cliente para um servidor extra. Isso deveria ter tido efeitos positivos no desempenho do site, mas há um problema com o bloqueio de tabelas no MyISAM. (Já ouvi falar do uso do InnoDB em vez do MyISAM, mas não podemos alterar o mecanismo em um futuro próximo).
Podemos identificá-lo em uma consulta de atualização que é realizada quando um moderador ativa um comentário no site de artigos. Este é o processo:

  • a consulta de atualização é processada SET status = 1 WHERE id = 5(o índice é definido)
  • os arquivos em cache da página são excluídos

Neste ponto, a página inteira fica lenta. O próprio banco de dados está ocupado por minutos. Eu busquei a lista de processos algumas vezes e vi cerca de 60 entradas de diferentes consultas de seleção, que estavam todas no estado aguardando o bloqueio de nível de tabela .

1. Não entendo por que essa atualização na tabela article_commentspode afetar as instruções select para que articlea tabela aguarde o bloqueio no nível da tabela. Na processlist quase todas as consultas em espera eram desta tabela. Eu li sobre o fato de que atualizações/inserções são preferidas a seleções e que isso pode causar tais problemas, mas a tabela de artigos em si não é atualizada quando os comentários são ativados, então as seleções não devem esperar. Eu entendi errado isso?
2. Existe algo além de mudar para o InnoDB para evitar esse comportamento ou pelo menos para obter um equilíbrio melhor? Estou muito irritado com o fato de que esse problema não apareceu antes de mover o banco de dados para o novo servidor. Acho que há alguma configuração errada, mas não sei como identificar.

mysql performance
  • 2 2 respostas
  • 68041 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-07-19T08:45:21+08:002012-07-19T08:45:21+08:00

    O MyISAM Storage Engine é furiosamente notório por realizar bloqueios de tabela completos para qualquer DML (INSERTs, UPDATEs, DELETEs). O InnoDB definitivamente resolveria esse problema a longo prazo.

    Eu escrevi sobre prós e contras de usar MyISAM vs InnoDB

    • InnoDB vs MyISAM com muitos índices (05 de julho de 2012)
    • Qual é mais rápido, InnoDB ou MyISAM? (03 de maio de 2012)
    • Alguma pegadinha com a conversão de MyISAM para InnoDB? (09 de janeiro de 2012)
    • Devo usar um mecanismo de armazenamento diferente do MyISAM para otimizar essas tabelas ou devo obter discos melhores? (07 de outubro de 2011)
    • Benefícios do bloqueio no nível da mesa (14 de setembro de 2011)
    • Quais são as principais diferenças entre InnoDB e MyISAM? (14 de abril de 2011)

    Com relação à sua pergunta atual, aqui está um cenário possível:

    • articlee article_commentssão ambas tabelas MyISAM
    • article_commentstem um ou mais índices com statuscomo uma coluna
    • As atualizações da página de índice article_commentssão armazenadas em cache no MyISAM Key Buffer (dimensionado por key_buffer_size ), fazendo com que as páginas de índice antigas saiam do MyISAM Key Buffer
    • Você tem consultas SELECT que executam JOINs entre articleearticle_comments

    No meu cenário sugerido, SELECTs na articletabela podem ser impedidos de permitir gravações por causa de ter que esperar para article_commentsestar livre de qualquer DML (neste caso, um UPDATE)

    • 8
  2. Rick James
    2012-07-24T15:40:44+08:002012-07-24T15:40:44+08:00

    Neste ponto, a página inteira fica lenta. O próprio banco de dados está ocupado por minutos.

    Cheira como se você tivesse um grande Query_cache?

    mysql> SHOW VARIABLES LIKE 'query_cache%';
    +------------------------------+----------+
    | Variable_name                | Value    |
    +------------------------------+----------+
    | query_cache_limit            | 1048576  |
    | query_cache_min_res_unit     | 4096     |
    | query_cache_size             | 16777216 | -- Not over 50M
    | query_cache_type             | DEMAND   | -- Only if using SQL_CACHE
    | query_cache_wlock_invalidate | OFF      |
    +------------------------------+----------+
    

    Para sistemas de produção com muitas gravações, você também pode desativar o query_cache.

    Todas as entradas no query_cache para a tabela fornecida são limpas quando ocorre qualquer gravação nessa tabela. Quanto maior o QC, mais lenta é essa tarefa.

    MyISAM usa bloqueios de "nível de tabela". Leituras e gravações não podem ocorrer ao mesmo tempo (na mesma tabela). Bruto, mas eficaz.

    • 8

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve