Respuesta de Community Wiki generada a partir de comentarios sobre la pregunta de Raymond Nijland
Uso EXPLAIN
. De esta manera puede ver si una consulta PUEDE necesitar un disco IO. Es necesario evitar en la columna adicional "Uso temporal" o "" Uso temporal; Uso de clasificación de archivos (tenga en cuenta que la clasificación de archivos es un nombre engañoso: si el conjunto de resultados cabe en la memoria, la clasificación rápida se ejecuta en la memoria) ".
Lo más probable es que esto sea causado por subconsultas / uniones / ordenar por / agrupar por / ... Si su resultado es grande y se crea una tabla temporal basada en disco MyISAM, y necesita ordenar el resultado, está ordenando el resultado conjunto basado en lecturas de IO y escrituras de IO con algoritmo de clasificación rápida.
En Uso de tabla temporal interna en MySQL puede leer cuando MySQL necesita crear una tabla MyISAM basada en disco. Tal vez pueda usar avg_row_length * filas (aunque tenga en cuenta que el valor de las filas de explicar no es exacto con el motor InnoDB) para verificar si el resultado cabe en el montón. Consulte la Sintaxis de SHOW TABLE STATUS .
En general, ¿es mejor InnoDB o MyISAM para evitar solicitudes de E / S?
InnoDB almacenará en búfer los datos de la tabla y los datos de índice, mientras que MyISAM solo almacena las claves de índice. Se necesita una E / S para los datos de la tabla cuando la columna de explicación adicional no dice "Usar índice".
Si ambos usan índices: con InnoDB, si el búfer está caliente, puede cargar datos desde la memoria. Si los índices deben provenir del disco, existe una fórmula que puede usar para calcular las lecturas de E / S necesarias para selecciones, inserciones y actualizaciones. De Estimación del rendimiento de la consulta :
Para tablas pequeñas, generalmente puede encontrar una fila en una búsqueda de disco (porque el índice probablemente se almacena en caché). Para tablas más grandes, puede estimar que, usando índices de árbol B, necesita esta cantidad de búsquedas para encontrar una fila:
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
Los índices de InnoDB son más grandes porque almacena datos fuera de la clave PRIMARY / UNIQUE en un índice KEY. Esto es más rápido y necesita aún menos búsquedas de IO, pero puede comprimir datos o índices de InnoDB.