Si j'étais vous, je passerais toutes les données à InnoDB. Le verrouillage de table / verrouillage de ligne a longtemps été discuté par beaucoup. Je choisirais toujours InnoDB haut la main. Cependant, il existe une autre raison profonde de choisir InnoDB ... CACHING .
Alors que la plupart des gens se vantent que MyISAM est plus rapide pour les lectures, la plupart des gens oublient que les nombreux cache pour MyISAM, qui est appelé le cache de clés (défini par key_buffer_size), ne mettent en cache que les pages d'index des fichiers .MYI. Il ne met jamais en cache les pages de données. Il a un maximum officiel de 4 Go dans les systèmes 32 bits. 8 Go est le meilleur maximum pour 64 bits.
Le pool de tampons InnoDB met en cache les pages de données et d'index. En fonction du serveur dont vous disposez, vous pouvez mettre en cache l'ensemble de données dans la RAM. Vous pouvez régler InnoDB jusqu'à 80% de RAM et 10% pour les connexions DB, et laisser 10% pour le système d'exploitation. Cela est vrai même pour différents systèmes d'exploitation .
J'ai recommandé ces choses aux clients Drupal avec un merveilleux succès. Cela s'applique également à Wordpress . J'ai fourni un support DB pour les clients avec WordPress. Mêmes améliorations.
Vous pouvez toujours configurer la mémoire pour InnoDB plus efficacement que vous ne pouvez plus MyISAM. Il existe toujours un moyen d' ajuster InnoDB pour répondre à vos besoins de performances . Au fur et à mesure que vos données augmentent, cela deviendra éventuellement une exigence .
MISE À JOUR 2011-11-21 11:44 EST
Si votre ensemble de données complet est suffisamment petit, vous pouvez exécuter une requête SELECT sur chaque table que vous avez juste après le démarrage de mysql.
Pour toutes les tables qui sont InnoDB et / ou MyISAM, exécutez cette requête:
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
;
Cela produira toutes les requêtes SELECT possibles que vous devez exécuter et qui convoquera tous les index à référencer. Placez cette requête dans un fichier appelé /root/MakeSelectQueriesToLoad.sql. Exécutez le script et collectez la sortie /root/SelectQueriesToLoad.sql. Enfin, exécutez-le:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Cela préchargera certainement toutes les pages d'index dans le pool de tampons InnoDB et le cache de clés MyISAM. Si toutes vos données sont InnoDB, apportez deux modifications:
- remplacer
WHERE engine IN ('InnoDB','MyISAM')
parWHERE engine='InnoDB'
- remplacer
CONCAT('SELECT ',ndxcollist,' FROM ',
parCONCAT('SELECT * FROM ',
Cela remplira également plus de pages de données dans le pool de tampons InnoDB.
NOTE FINALE: Assurez-vous que le pool de tampons InnoDB est suffisamment grand pour contenir toutes vos données InnoDB