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

Welche MySQL-Abfrage ist schneller?

Sie sollten immer EXPLAIN verwenden um zu bestimmen, wie Ihre Abfrage ausgeführt wird.

Leider führt MySQL Ihre Unterabfrage als ABHÄNGIGE ABFRAGE aus, was bedeutet, dass die Unterabfrage für jede Zeile in der äußeren Abfrage ausgeführt wird. Man könnte meinen, MySQL wäre schlau genug, um zu erkennen, dass die Unterabfrage keine korrelierte Unterabfrage ist, und würde sie nur einmal ausführen, leider ist es noch nicht so schlau.

MySQL durchsucht also alle Zeilen in students, führt die Unterabfrage für jede Zeile aus und verwendet keinerlei Indizes für die äußere Abfrage.

Das Schreiben der Abfrage als JOIN würde es MySQL ermöglichen, Indizes zu verwenden, und die folgende Abfrage wäre der optimale Weg, sie zu schreiben:

SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
  ON c.id = s.classes_id
  AND c.departments_id = 1
WHERE s.status = 1

Dies würde die folgenden Indizes verwenden:

students(`status`)
classes(`id`, `departements_id`) : multi-column index