Eliminazione di grandi quantità (4 milioni di righe) di dati mysql in modo efficiente, su base molto regolare


10

Abbiamo una tabella mysql che in ogni dato momento ha circa 12 milioni di righe. Dobbiamo eliminare i vecchi dati per mantenere un po 'gestibili le dimensioni della tabella.

In questo momento stiamo eseguendo questa query ogni giorno, a mezzanotte, utilizzando un processo cron:

DELETE FROM table WHERE endTime < '1393632001'

L'ultima volta che la query è stata eseguita ha esaminato 4.602.400, ha impiegato oltre 3 minuti e la CPU ha superato il tetto.

CPU spiking a mezzanotte

Cosa possiamo fare per evitare che la CPU, le connessioni db sincrone, la profondità dell'indicazione del disco, ecc., Si spargano irragionevolmente pur cancellando i vecchi dati?

PS: Noterai che la query si sta effettivamente verificando in un momento abbastanza inopportuno nel nostro ciclo di utilizzo. Supponiamo che abbiamo già spostato i tempi della query in modo che si verifichino nel punto di utilizzo più basso ogni giorno. Inoltre, non esiste alcun indice su "endTime" e preferirei mantenerlo in questo modo, se possibile, perché ci sono tonnellate di dati che vengono inseriti molto regolarmente e non c'è molta ricerca.

php  mysql 

forse usa cron job per cancellare ogni 10 minuti e 100k per round o ogni 5 minuti 50k per round

pezzi più piccoli su base più regolare?

ok, ma sembra che ciò possa paralizzare la nostra esperienza utente per periodi di tempo più lunghi :) qualcosa che possiamo fare per interrogare / progettare saggiamente?

1
186k utenti, nessun db guy dedicato?

1
Otterrai risposte migliori su "Amministratori di database"
James Anderson

Risposte:


13

La soluzione al tuo problema è una funzionalità MySQL chiamata "partizionamento". La documentazione è qui .

Ciò che fa il partizionamento è memorizzare una singola tabella in "partizioni" separate. Questi sono definiti da un'espressione particolare, generalmente un valore o un intervallo di colonne. Nel tuo caso, questo probabilmente si baserebbe su endTime- supponendo che sia noto quando viene creato un record e non cambia.

Conserveresti un giorno di endTimeogni partizione. Quindi il passaggio di eliminazione consisterebbe nel troncare una partizione anziché eliminare un gruppo di righe in una grande tabella. Il troncamento della partizione sarebbe un metodo molto più veloce.


wow, è stato incredibilmente utile e sembra una soluzione perfetta. È ora di leggere sul partizionamento! Grazie!

Sebbene il partizionamento possa essere una buona soluzione, fai attenzione alle spese generali, ma potrebbe rallentare significativamente le tue domande. Inoltre, la tabella troncata non è istantanea. Vorrei prendere in considerazione l'archiviatore di pt. Puoi risolvere i tuoi problemi con picchi e mantenere il tuo tavolo semplice come lo è ora
Akuzminsky
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.