Se eu fosse você, trocaria todos os dados para o InnoDB. O bloqueio de tabela / bloqueio de linha tem sido discutido por muitos. Eu sempre escolheria o InnoDB de mãos dadas. No entanto, há outro motivo profundo para escolher o InnoDB ... CACHING .
Enquanto muitas pessoas se gabam de que o MyISAM é mais rápido para leituras, muitas pessoas esquecem que o muitos cache do MyISAM, que é chamado de cache de chaves (definido por key_buffer_size), apenas armazena em cache as páginas de índice dos arquivos .MYI. Ele nunca armazena em cache as páginas de dados. Possui um máximo oficial de 4 GB em sistemas de 32 bits. O máximo de 8 GB é o máximo para 64 bits.
O InnoDB Buffer Pool armazena em cache os dados e as páginas de índice. Dependendo do servidor que você possui, você pode armazenar em cache até todo o conjunto de dados na RAM. Você pode ajustar o InnoDB para até 80% de RAM e 10% para DB Conenctions e deixar 10% para o sistema operacional. Isso é verdade mesmo para diferentes sistemas operacionais .
Eu recomendei essas coisas para os clientes do Drupal com um sucesso maravilhoso. Também se aplica ao Wordpress . Forneci suporte ao banco de dados para clientes com WordPress. Mesmas melhorias.
Você sempre pode configurar a memória do InnoDB de maneira mais eficaz do que o MyISAM. Sempre existe uma maneira de usar o InnoDB para atender às suas necessidades de desempenho . À medida que seus dados crescem, eles acabam se tornando um requisito .
ATUALIZAÇÃO 21/11/2011 11:44 EST
Se seu conjunto de dados completo for pequeno o suficiente, você poderá executar uma consulta SELECT em todas as tabelas que você possui logo após o mysql iniciar.
Para todas as tabelas que são InnoDB e / ou MyISAM, execute esta consulta:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Isso produzirá todas as consultas SELECT possíveis que você precisa executar que invocam todos os índices a serem referenciados. Coloque esta consulta em um arquivo chamado /root/MakeSelectQueriesToLoad.sql. Execute o script e colete a saída /root/SelectQueriesToLoad.sql. Por fim, execute-o:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Isso definitivamente pré-carregará todas as páginas de índice no InnoDB Buffer Pool e no MyISAM Key Cache. Se todos os seus dados forem do InnoDB, faça duas alterações:
- substitua
WHERE engine IN ('InnoDB','MyISAM')
porWHERE engine='InnoDB'
- substitua
CONCAT('SELECT ',ndxcollist,' FROM ',
porCONCAT('SELECT * FROM ',
Isso também preencherá mais páginas de dados no InnoDB Buffer Pool.
NOTA FINAL: Verifique se o InnoDB Buffer Pool é grande o suficiente para armazenar todos os seus dados do InnoDB