Ich muss ungefähr 10K Zeilen aus einer Tabelle löschen, die basierend auf einigen Kriterien mehr als 100 Millionen Zeilen enthält. Wenn ich die Abfrage ausführe, dauert es ungefähr 5 Minuten. Ich habe einen EXPLAIN-Plan ausgeführt (die delete
-Abfrage wurde in select *
konvertiert, da MySQL explain delete
nicht unterstützt) und festgestellt, dass MySQL den falschen Index verwendet.
Meine Frage ist: Gibt es eine Möglichkeit, MySQL mitzuteilen, welcher Index beim Löschen verwendet werden soll? Wenn nicht, was kann ich tun? Wählen Sie, um die Tabelle zu temporär zu laden und dann aus der temporären Tabelle zu löschen?
Es gibt Indexhinweis-Syntax . //ETA: sadly, not for deletes
ETA:
Haben Sie versucht, ANALYZE TABLE $mytable
auszuführen?
Wenn sich das nicht auszahlt, denke ich, dass Sie zwei Möglichkeiten haben: Löschen Sie den fehlerhaften Index vor dem Löschen und erstellen Sie ihn nachher neu. Oder VERBINDEN Sie Ihre Tabelle löschen zu einer anderen Tabelle auf dem gewünschten Index, die sicherstellen sollte, dass der gewünschte Index verwendet wird.
Ich bin nie wirklich auf eine Situation gestoßen, in der MySQL den falschen Index gewählt hat, sondern eher, dass mein Verständnis davon, wie Indizes funktionierten, normalerweise fehlerhaft war.
Vielleicht möchten Sie dieses Buch lesen: Ссылка
Es gibt einen großartigen Abschnitt darüber, wie Indizes funktionieren und andere Optimierungsoptionen.
Tags und Links mysql sql-execution-plan query-optimization sql-delete