Come stimare le operazioni di I / O eseguite dalle query MySQL?


13

Su Amazon RDS, paghi circa $ 0,10 per 1 milione di richieste I / O. Ho notato un numero molto elevato (in centinaia di migliaia) di richieste I / O per un database a traffico molto basso. Vedendo ciò, ho fatto ulteriori ricerche e ho trovato questa domanda che descrive che per un sito Web di 6.000 utenti, generava 800 milioni di richieste I / O al mese, il che gli sarebbe costato circa $ 80 / al mese.

Pertanto, voglio sapere in anticipo quante operazioni di I / O genererebbero una query MySQL e come ottimizzarle / minimizzarle. Esiste un modo per stimare il numero di operazioni di I / O che una query eseguirà e le regole generali che posso seguire per mantenerle il più basse possibile?

Risposte:


2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.