Devo reindicizzare la tabella mysql dopo l'eliminazione di massa?


10

Ho una tabella in MySQL con un sacco di INSERT e SELECT ogni secondo. E c'è una cancellazione in blocco di alcuni dati più vecchi una volta al giorno. Devo reindicizzare la tabella dopo l'eliminazione? Voglio aumentare le prestazioni. Qualcuno può suggerire alcuni suggerimenti? Utilizzo di "innodb" come motore di archiviazione. Devo cambiarlo? Penso che sia meglio per l'inserimento e la selezione simultanei. Per favore, dai i tuoi suggerimenti. Devo fare la reindicizzazione?

Grazie in anticipo..

Risposte:


10

Devi ottimizzare le tabelle quando usi InnoDB? Sì e no, a seconda del carico di lavoro e se si verificano problemi di prestazioni o meno.

Un copia-incolore spudorato dalla documentazione di MySQL :

Per le tabelle InnoDB, OPTIMIZE TABLE è mappato su ALTER TABLE, che ricostruisce la tabella per aggiornare le statistiche dell'indice e liberare spazio inutilizzato nell'indice cluster. Questo viene visualizzato nell'output di OPTIMIZE TABLE quando lo si esegue su una tabella InnoDB, come mostrato qui:

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

Questa operazione non utilizza la creazione rapida dell'indice. Gli indici secondari non vengono creati in modo efficiente poiché le chiavi vengono inserite nell'ordine in cui sono apparse nella chiave primaria. Vedere la Sezione 14.14.6, "Limitazioni della creazione rapida di indici".

InnoDB archivia i dati utilizzando un metodo di allocazione delle pagine e non soffre di frammentazione allo stesso modo dei motori di archiviazione legacy (come MyISAM). Quando si considera se eseguire l'ottimizzazione o meno, considerare il carico di lavoro delle transazioni che il server elaborerà:

  • È previsto un certo livello di frammentazione. InnoDB riempie solo le pagine al 93%, per lasciare spazio agli aggiornamenti senza dover dividere le pagine.

  • Le operazioni di eliminazione potrebbero lasciare spazi vuoti che lasciano le pagine meno riempite del desiderato, il che potrebbe rendere utile l'ottimizzazione della tabella.

  • Gli aggiornamenti alle righe di solito riscrivono i dati all'interno della stessa pagina, a seconda del tipo di dati e del formato della riga, quando è disponibile spazio sufficiente. Vedere la Sezione 14.10.5, "Funzionamento della compressione per le tabelle InnoDB" e la Sezione 14.12.1, "Panoramica dell'archiviazione delle righe di InnoDB".

  • I carichi di lavoro ad alta concorrenza potrebbero lasciare vuoti negli indici nel tempo, poiché InnoDB conserva più versioni degli stessi dati grazie al meccanismo MVCC. Vedere la Sezione 14.5.12, "Multi-Versioning di InnoDB".


5

È possibile reindicizzare la tabella e persino ridurla. Tuttavia, se si desidera ritardare tale manutenzione basata su disco, è necessario almeno ricalcolare le statistiche dell'indice.

Senza ricalcolare le statistiche dell'indice, MySQL Query Optimizer potrebbe fare una scelta sbagliata per i piani di query EXPLAIN. Ciò potrebbe influire negativamente su SELECT se le statistiche per dati inesistenti sono ancora presenti. Questo vale sia per MyISAM che per InnoDB.

Non è necessario ridurre la tabella per calcolare le statistiche dell'indice, anche se sarà migliore per le prestazioni complessive.

Per calcolare le statistiche per tutti gli indici in una tabella, eseguiresti

ANALYZE TABLE tablename;

Potresti farlo ogni notte. Non tenterà di eseguire alcuna deframmentazione o riduzione dei dati. Probabilmente potresti farlo una volta alla settimana correndo OPTIMIZE TABLE tablename;. Questo farà anche ANALYZE TABLE tablename;per te dopo la riduzione del file fisico della tabella ( .ibdper InnoDB o .MYIper MyISAM) o.


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.