MyISAM para leitura de dados


10

Eu tenho uma tabela com cerca de 1 bilhão de linhas e seus 98% de leitura intensiva.

Tentei ajustar o banco de dados, com diferentes mecanismos de armazenamento (MyISAM e InnoDB)

Em seguida, executou alguns testes para visualizar o desempenho

Na cláusula where, eu tinha um ID de chave primária e parecia que, como o MyISAM Key Cache armazena todo o índice em seu buffer, o uso do MyISAM parecia ser bastante rápido, cerca de 2 vezes mais rápido que o InnoDB

Mas para o InnoDB, parecia mais lento !! O InnoDB não usa nenhum buffer para pré-carregar os índices?


talvez algum dos moderadores felizes que votam para encerrar a pergunta possa elaborar suas motivações?
PQD

Você pode nos dar uma idéia do tamanho do banco de dados e da tabela em questão? O tamanho total no disco seria útil. Além disso, em que especificação você está executando a máquina?
Dave Rix

Respostas:


6

Antes de decidir sobre o MyISAM ou o InnoDB, você terá que examinar os dois mecanismos de armazenamento em termos de como cada um armazena em cache

MyISAM

Quando lidos, os índices de uma tabela MyISAM podem ser lidos uma vez no arquivo .MYI e carregados no cache de chaves MyISAM (conforme o tamanho de key_buffer_size ). Como você pode ler o arquivo .MYD de uma tabela MyISAM mais rápido? Com isso:

ALTER TABLE mytable ROW_FORMAT=Fixed;

Eu escrevi sobre isso em meus posts anteriores

InnoDB

OK, e o InnoDB? O InnoDB faz E / S de disco para consultas? Surpreendentemente, sim! Você provavelmente está pensando que eu sou louco por dizer isso, mas é absolutamente verdade, mesmo para consultas SELECT . Neste ponto, você provavelmente está se perguntando "Como o InnoDB está fazendo a E / S de disco para consultas?"

Tudo remonta ao InnoDB como um mecanismo de armazenamento transacional compatível com ACID . Para que o InnoDB seja Transacional, ele precisa suportar o Iin ACID, que é Isolation. A técnica para manter o isolamento para transações é feita via MVCC, Multiversion Concurrency Control . Em termos simples, o InnoDB registra a aparência dos dados antes que as transações tentem alterá-los. Onde isso é gravado? No arquivo de espaço de tabela do sistema, mais conhecido como ibdata1. Isso requer E / S de disco .

COMPARAÇÃO

Como o InnoDB e o MyISAM realizam E / S de disco, que fatores aleatórios determinam quem é mais rápido?

  • Tamanho das colunas
  • Formato da coluna
  • Conjuntos de caracteres
  • Faixa de valores numéricos (exigindo INTs grandes o suficiente)
  • Linhas sendo divididas entre blocos (encadeamento de linhas)
  • Fragmentação de dados causada por DELETEseUPDATEs
  • Tamanho da chave primária (o InnoDB possui um índice clusterizado, exigindo duas pesquisas de chave)
  • Tamanho das entradas do índice
  • A lista continua...

EPÍLOGO

Assim, em um ambiente de leitura pesada, é possível que uma tabela MyISAM com um formato de linha fixa supere as leituras do InnoDB do InnoDB Buffer Pool se houver dados suficientes sendo gravados nos logs de desfazer contidos no ibdata1 para suportar o comportamento transacional imposta aos dados do InnoDB. Planeje seus tipos de dados, consultas e mecanismo de armazenamento com muito cuidado. Depois que os dados crescem, pode ser muito difícil mover os dados.

A propósito, escrevi algo parecido com isso há 5 dias: Como atribuir um limite de memória para o mySQL?


o innodbe realmente gera leituras de disco quando todos os dados já estão no buffer pool e não há solicitações de modificação de dados simultâneas, apenas leituras?
PQD

É meu palpite que, como o solicitante tem 1 bilhão de linhas em seu banco de dados, é improvável que ele tenha tudo armazenado em cache na RAM no buffer pool - portanto, haverá leituras necessárias para acessar os dados fora do buffer pool e no disco?
perfil completo de Dave Rix

3

O MyISAM sempre rodará muito mais rápido que o innodb quando não houver contenção para os dados. Comece adicionando várias sessões tentando atualizar a mesma tabela e o innodb obtém rapidamente a vantagem de desempenho.

Como você ajusta o sistema para os 2 motores é muito diferente.

A razão pela qual diferentes mecanismos existem é porque existem diferentes cargas de trabalho / padrões de acesso.


2

você precisa 'aquecer' o innodb. por exemplo, reproduzindo os logs de acesso ou executando algumas consultas inteligentes que afetam cada valor do índice.

dê uma olhada aqui ou aqui .

Espero que você não use as configurações padrão do mysql para o innodb - elas foram adequadas para o hardware a partir de ~ 2000.


Fiz alterações na configuração padrão, também executei a consulta várias vezes, cerca de 30 vezes, mas produzi quase os mesmos resultados. Ele foi mais rápido depois de algumas tentativas, mas manteve-se mais lento do que MYISAM, também usado MariaDB (última versão)
Akash


0

Depois de ajustar o InnoDB no MariaDB, aumentei o innodb_buffer_pool_sizetamanho do meu banco de dados InnoDB, pois, ao fazer isso, o InnoDB começou a buscar linhas mais rapidamente

Suponho que ajustar o InnoDB seja muito importante de acordo com as necessidades do seu banco de dados

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.