Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie sage ich dem MySQL-Optimierer, dass er den Index für eine abgeleitete Tabelle verwenden soll?

Es gibt eine Lösung dafür in MySQL Server 5.6 - der Vorschauversion (zum Zeitpunkt des Schreibens dieses Artikels).

http://dev.mysql.com /doc/refman/5.6/en/from-clause-subquery-optimization.html

Allerdings bin ich mir nicht sicher, ob der MySQL-Optimierer Indizes wiederverwenden wird, die bereits vorhanden sind, wenn er "Indizes zur abgeleiteten Tabelle hinzufügt"

Betrachten Sie die folgende Abfrage:

SELECT * FROM t1JOIN (SELECT * FROM t2) WIE abgeleitet_t2 EIN t1.f1=derived_t2.f1;

In der Dokumentation heißt es:"Der Optimierer erstellt einen Index über Spalte f1 aus abgeleiteter_t2, wenn dies die Verwendung von ref-Zugriff für den Ausführungsplan mit den niedrigsten Kosten ermöglichen würde."

OK, das ist großartig, aber verwendet der Optimierer Indizes von t2 wieder? Mit anderen Worten, was wäre, wenn ein Index für t2.f1 existierte? Wird dieser Index wiederverwendet oder erstellt der Optimierer diesen Index für die abgeleitete Tabelle neu? Wer weiß?

BEARBEITEN: Die beste Lösung bis MySQL 5.6 besteht darin, eine temporäre Tabelle zu erstellen, einen Index für diese Tabelle zu erstellen und dann die SELECT-Abfrage für die temporäre Tabelle auszuführen.