Ho un programma C che estrae un'enorme fonte di dati (20 GB di testo non elaborato) e genera un sacco di INSERT da eseguire su una semplice tabella vuota (4 colonne integer con 1 chiave primaria). Impostazione come tabella MEMORY
, l'intera attività viene completata in 8 ore. Dopo aver terminato, nella tabella sono presenti circa 150 milioni di righe. Otto ore sono un numero completamente dignitoso per me. Questo è un affare di una volta.Generazione di una tabella MySQL da 150 milioni di righe
Il problema nasce quando si cerca di convertire la tabella MEMORY
di nuovo in modo che MyISAM
(A) avrò la memoria liberata per altri processi e (B) i dati non saranno uccisi quando si riavvia il computer.
ALTER TABLE memtable ENGINE = MyISAM
ho lasciato questa corsa ALTER TABLE
query per più di due giorni ormai, e non è fatto. L'ho ucciso ora.
Se creo la tabella inizialmente come MyISAM, la velocità di scrittura sembra terribilmente scarsa (soprattutto perché la query richiede l'uso della tecnica ON DUPLICATE KEY UPDATE
). Non riesco a spegnere temporaneamente le chiavi. Il tavolo diventerebbe oltre 1000 volte più grande se dovessi e poi dovrei rielaborare le chiavi ed essenzialmente eseguire un GROUP BY su 150.000.000.000 di righe. Umm, no.
Uno dei principali limiti da realizzare: la query INSERT UPDATE registra se la chiave primaria (un hash) esiste già nella tabella.
All'inizio di un tentativo di utilizzare rigorosamente MyISAM, ho una velocità approssimativa di 1.250 righe al secondo. Una volta che l'indice cresce, immagino che questo tasso aumenterà ancora di più.
Ho 16 GB di memoria installata nella macchina. Qual è il modo migliore per generare una tabella enorme che alla fine finisce come tabella MyISAM su disco, indicizzata?
Chiarimento: Ci sono molti, molti aggiornamenti in corso dalla query (INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever
). Questo non è, in alcun modo, un problema di discarica grezza. Il mio ragionamento per aver provato una tabella MEMORY
era per l'accelerazione di tutte le ricerche sull'indice e le modifiche alla tabella che si verificano per ogni INSERT.
InnoDB andrebbe bene. Questo è molto intelligente ... Mi piace. Grazie per avermi inviato commenti. Lo apprezzo. :) – brianreavis