Velocizza gli inserti MySQL con partizioni su MyISAM con chiave univoca


9

Ho una grande tabella MyISAM (~ 30 M righe). Ad un certo punto l'ho passato al formato di riga fissa, quindi ora la tabella richiede ~ 40Gb su disco e 2Gb per gli indici. La tabella ha un indice univoco e ci sono 100 query "insert on duplicate key update" al secondo. Man mano che la tabella cresce, questi inserti diventano sempre più lenti.

Non sono sicuro, ma le partizioni mi aiuteranno ad accelerare gli inserti?

Risposte:


1

Prima di tutto, le scritture simultanee non sono sicuramente un'opzione per l'archiviazione MyISAM. Ognuno di loro bloccherà un intero tavolo (tranne che per la lettura in alcuni casi). Se InnoDB non ti soddisfa bene, prova TokuDB. Ma sarà più lento rispetto a MyISAM a causa della natura transazionale del motore TokuDB (e ovviamente InnoDB) (dovresti scrivere gli stessi dati almeno due volte: journal e file di dati). Inoltre, se il tuo server si arresta in modo anomalo un giorno, dovrai aspettare ore prima che il tuo tavolo MyISAM da 40 GB venga riparato.

Se vuoi ancora caricare i dati nelle tue tabelle MyISAM e vuoi farlo velocemente, posso consigliare di usare al LOAD DATA INFILEposto degli inserti. Questo è il modo più veloce per caricare grandi volumi di dati nella tabella. E sì, gli indici rallenteranno le prestazioni dell'inserto in modo esponenziale.

Una parola sulle partizioni: le istruzioni INSERT in MySQL non supportano la potatura, quindi tutte le partizioni verranno scansionate su ogni istruzione per una corrispondenza univoca dell'indice. Inoltre, tutte le partizioni verranno bloccate fino alla fine dell'inserimento.



0

Queste query di inserimento sono simultanee o originate dallo stesso processo? Se sono concorrenti è meglio usare l'archiviazione InnoDB per questa tabella perché MyISAM blocca l'intera tabella e InnoDB utilizza i blocchi di riga. Se il passaggio a un'altra memoria non è un'opzione, è possibile provare l'istruzione INSERT DELAYED e diverse altre ottimizzazioni di inserimento . Il partizionamento non aiuta se non si posizionano partizioni diverse su dischi fisici diversi.


Questi inserti sono simultanei. Ma InnoDB è troppo lento a "inserire in aggiornamento chiave duplicata", quindi non è un'opzione. Per quanto ne so, IO non è un collo di bottiglia: la quantità di RAM >> dimensione delle tabelle, inclusi gli indici e la scrittura, è attiva. Penso che il problema risieda da qualche parte nelle serrature interne di mysql o qualcosa del genere.
d0rc,

INSERT DELAYED deve essere utilizzato solo per le istruzioni INSERT che specificano elenchi di valori. Il server ignora le istruzioni RITARDATO per INSERT ... SELECT o INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro,

"InnoDB è troppo lento" - hai provato a sintonizzarlo un po '? Le impostazioni predefinite sono piuttosto scadenti.
camper
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.