Réponse du wiki communautaire générée à partir des commentaires sur la question par Raymond Nijland
Utilisez EXPLAIN
. De cette façon, vous pouvez voir si une requête PEUT avoir besoin d'E / S disque. Vous devez éviter dans la colonne extra "Utilisation temporaire" ou "" Utilisation temporaire; Utilisation du tri de fichiers (notez que le tri de fichiers est un nom trompeur: si le jeu de résultats tient en mémoire, le tri rapide est exécuté en mémoire) ".
Cela est probablement dû à des sous-requêtes / unions / ordre par / groupe par / ... Si votre résultat est grand et qu'une table temporaire sur disque MyISAM est créée, et que vous devez trier le résultat, vous triez le résultat ensemble basé sur les lectures IO et les écritures IO avec l'algorithme de tri rapide.
Dans Utilisation de table temporaire interne dans MySQL, vous pouvez lire quand MySQL doit créer une table MyISAM sur disque. Vous pouvez peut-être utiliser les lignes avg_row_length * (bien que la valeur des lignes d'expliquer ne soit pas exacte avec le moteur InnoDB) pour vérifier si le résultat tient dans le tas. Voir SHOW TABLE STATUS Syntax .
En général, InnoDB ou MyISAM sont-ils meilleurs pour éviter les demandes d'E / S?
InnoDB mettra en mémoire tampon les données de table et les données d'indexation, alors que MyISAM ne tamponne que les clés d'indexation. Une E / S vers les données de la table est nécessaire lorsque la colonne supplémentaire d' explication ne dit pas "Utilisation de l'index".
Si les deux utilisent des index: Avec InnoDB, si le tampon est chaud, il peut charger des données de la mémoire. Si les index doivent provenir du disque, il existe une formule que vous pouvez utiliser pour calculer les lectures d'E / S nécessaires pour les sélections, les insertions et les mises à jour. D'après l' estimation des performances des requêtes :
Pour les petites tables, vous pouvez généralement trouver une ligne dans une recherche de disque (car l'index est probablement mis en cache). Pour les tables plus grandes, vous pouvez estimer que, à l'aide des index B-tree, vous avez besoin de ce nombre de recherches pour trouver une ligne:
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
Les index InnoDB sont plus volumineux car ils stockent les données de la clé PRIMARY / UNIQUE dans un index KEY. Ceci est plus rapide et nécessite encore moins de recherches d'E / S, mais vous pouvez compresser des données ou des index InnoDB.