Prestazioni Mysql su un tavolo da 6 milioni di righe

Un giorno sospetto che dovrò imparare Hadoop e trasferire tutti questi dati su un database non strutturato, ma sono sorpreso nel constatare che le prestazioni si degradano in modo così significativo in un così breve periodo di tempo.

Ho una tabella mysql con poco meno di 6 milioni di righe. Sto facendo una query molto semplice su questo tavolo, e credo di avere tutti gli indici corretti in atto.

la query è

 SELECT data, ora FROM eventi WHERE venid = '47975' AND date> = '2009-07-11' ORDER BY date

la spiegazione ritorna

 id select_type tipo di tabella possible_keys key key_len ref rows Extra
 1 SIMPLE updateshows range date_idx date_idx 7 NULL 648997 Utilizzo di dove

quindi sto usando l’indice corretto per quanto posso dire, ma questa query impiega 11 secondi per essere eseguita.

Il database è MyISAM e phpMyAdmin dice che la tabella è 1.0GiB.

Qualche idea qui?

Modificato: il date_idx indicizza sia la data che le colonne venid. Dovrebbero essere due indici separati?

Quello che vuoi essere sicuro è che la query userà SOLO l’indice, quindi assicurati che l’indice copra tutti i campi che stai selezionando. Inoltre, poiché si tratta di una query di intervallo coinvolta, è necessario avere prima il venid nell’indice, poiché viene interrogato come costante. Vorrei quindi creare e indicizzare in questo modo:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time); 

Con questo indice, tutte le informazioni necessarie per completare la query sono nell’indice. Ciò significa che, si spera, il motore di archiviazione è in grado di recuperare le informazioni senza cercare effettivamente all’interno del tavolo stesso. Tuttavia, MyISAM potrebbe non essere in grado di farlo, dal momento che non memorizza i dati nelle foglie degli indici, quindi potresti non ottenere l’aumento di velocità desiderato. In tal caso, provare a creare una copia della tabella e utilizzare il motore InnoDB sulla copia. Ripeti gli stessi passaggi là e vedi se ottieni un aumento significativo della velocità. InnoDB memorizza i valori dei campi nelle foglie dell’indice e consente indici di copertura.

Ora, si spera che vedrai quanto segue quando spieghi la query:

 mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date; id select_type table type possible_keys key [..] Extra 1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where 

Prova ad aggiungere una chiave che si estende su venid e data (o viceversa, o entrambi …)

Immagino che una tabella di fila da 6M dovrebbe essere ottimizzata con tecniche abbastanza normali.

Suppongo che tu abbia un server database dedicato e che abbia una quantità ragionevole di ram (ad esempio, almeno 8G).

Dovrai assicurarti di aver messo a punto mysql per utilizzare la ram in modo efficiente. Se stai utilizzando un sistema operativo a 32 bit, non farlo. Se si utilizza MyISAM, sintonizzare il buffer della chiave per utilizzare una proporzione significativa, ma non eccessiva, della ram.

In ogni caso, si desidera eseguire test delle prestazioni ripetuti su hardware di qualità di produzione.

Prova a mettere un indice sulla colonna venid .