2010-05-27 7 views
8

Devo cancellare circa 10K righe da una tabella che ha più di 100 milioni di righe in base ad alcuni criteri. Quando eseguo la query, ci vogliono circa 5 minuti. Ho eseguito un piano di spiegazioni (la query delete è stata convertita in select * poiché MySQL non supporta explain delete) e ha rilevato che MySQL utilizza l'indice errato.MySQL, eliminazione e indice suggerimento

La mia domanda è: c'è un modo per dire a MySQL quale indice usare durante l'eliminazione? In caso contrario, che cosa faccio? Selezionare la tabella temporanea quindi eliminare dalla tabella temporanea?

+0

Verificare di disporre di una chiave primaria e di indicizzare la colonna indicata nella clausola WHERE dell'eliminazione. –

risposta

4

C'è index hint syntax. //ETA: sadly, not for deletes

ETA: Hai provato a eseguire ANALYZE TABLE $mytable?

Se ciò non ripaga, sto pensando che hai 2 scelte: rilasciare l'indice offendente prima dell'eliminazione e ricrearlo dopo. O UNISCI la tua tabella di cancellazione a un'altra tabella sull'indice desiderato che dovrebbe garantire che venga utilizzato l'indice desiderato.

+1

Sì, ma secondo la mia comprensione, l'indice suggerimento non funziona per le istruzioni di cancellazione. –

+0

@Manuel Darveau: Drat! l'ho appena testato Hai ragione. – dnagirl

2

Non mi sono mai imbattuto in una situazione in cui MySQL ha scelto l'indice sbagliato, ma la mia comprensione del modo in cui gli indici hanno funzionato era di solito in errore.

Si potrebbe voler controllare questo libro: http://oreilly.com/catalog/9780596003067

Ha una grande sezione su come funzionano gli indici e le altre opzioni di ottimizzazione.

+0

+1, il libro ti apre gli occhi su molte cose a cui non avresti mai pensato. – newtover

+0

Modifica, dnagirl ha ragione riguardo la sintassi suggerimento indice, non sapevo che è andato in diretta. – UltimateBrent

+0

Ho visto mysql scegliere l'indice sbagliato molte volte. Per noi succede su una grande tabella (15 milioni di righe) che ha molti indici simili (15 indici). Forse uno scenario pazzo --- c'è una ragione --- e ottiene spesso l'indice sbagliato, anche quando l'inde scegliere dovrebbe essere il PRIMARIO. –