Risposta Wiki della community generata dai commenti sulla domanda di Raymond Nijland
Usa EXPLAIN
. In questo modo puoi vedere se una query PU need aver bisogno del disco IO. È necessario evitare nella colonna extra "Utilizzo temporaneo" o "" Utilizzo temporaneo; Usando filesort (nota che filesort è un nome fuorviante: se il set di risultati si adatta alla memoria, quicksort viene eseguito in memoria) ".
È molto probabile che ciò sia causato da sottoquery / sindacati / ordine per / gruppo per / ... Se il tuo risultato è grande e viene creata una tabella temporanea su disco MyISAM e devi ordinare il risultato, stai ordinando il risultato impostato in base a letture IO e scritture IO con algoritmo quicksort.
In Uso della tabella temporanea interna in MySQL puoi leggere quando MySQL deve creare una tabella MyISAM basata su disco. Forse puoi usare le file avg_row_length * (sebbene noti che il valore delle righe da spiegato non è esatto con il motore InnoDB) per verificare se il risultato si adatta all'heap. Vedere MOSTRA STATO TABELLA Sintassi .
In generale, InnoDB o MyISAM sono migliori per evitare richieste I / O?
InnoDB esegue il buffer dei dati della tabella e dei dati dell'indice, mentre MyISAM esegue il buffering solo delle chiavi dell'indice. È necessario un I / O per i dati della tabella quando la spiegazione di extra della colonna non dice "Uso dell'indice".
Se entrambi utilizzano indici: con InnoDB, se il buffer è caldo, può caricare i dati dalla memoria. Se gli indici devono provenire dal disco, esiste una formula che è possibile utilizzare per calcolare le letture IO necessarie per selezioni, inserimenti e aggiornamenti. Dalla stima delle prestazioni della query :
Per le tabelle piccole, in genere è possibile trovare una riga nella ricerca di un disco (poiché l'indice è probabilmente memorizzato nella cache). Per le tabelle più grandi, è possibile stimare che, utilizzando gli indici B-tree, sono necessarie molte ricerche per trovare una riga:
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
Gli indici InnoDB sono più grandi perché memorizza i dati della chiave PRIMARY / UNIQUE in un indice KEY. Questo è più veloce e richiede ancora meno ricerche di IO ma è possibile comprimere i dati o gli indici InnoDB.