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

Warum ist diese INNER JOIN/ORDER BY MySQL-Abfrage so langsam?

(Ich nehme an, Sie wollten ids.customer_id = customer.customer_id eingeben und nicht kunden_ids.kunden_id)

Ohne ORDER BY schnappte sich mysql die ersten 10 IDs vom Typ 10 (indiziert), suchte den Kunden nach ihnen und war fertig. (Beachten Sie, dass der LEFT JOIN hier wirklich ein INNER JOIN ist, da die Join-Bedingungen nur für Zeilen gelten, die in beiden Tabellen übereinstimmen)

Mit ORDER BY ruft mysql wahrscheinlich alle ab type=10 Kunden, die dann nach Vornamen sortiert werden, um die ersten 10 zu finden.

Sie können dies beschleunigen, indem Sie entweder die Kundentabelle denormalisieren (den Typ in den Kundendatensatz kopieren) oder eine Zuordnungstabelle erstellen, die customer_id, name, type enthält Tupel. Fügen Sie in beiden Fällen einen Index zu (type, name) hinzu . Wenn Sie die Zuordnungstabelle verwenden, verwenden Sie sie, um eine 3-Wege-Verbindung mit Kunden und IDs herzustellen.

Wenn type=10 einigermaßen üblich ist, können Sie die Abfrage auch zwingen, die Kundentabelle nach Namen zu durchsuchen und den Typ für jeden mit STRAIGHT JOIN zu überprüfen. Es wird nicht so schnell sein wie ein zusammengesetzter Index, aber es wird schneller sein, als alle Übereinstimmungen abzurufen.

Führen Sie, wie oben vorgeschlagen, ein EXPLAIN für Ihre Abfrage aus, um den Abfrageplan anzuzeigen, den mysql verwendet.