Bạn nên luôn sử dụng EXPLAIN
để xác định cách truy vấn của bạn sẽ chạy.
Thật không may, MySQL sẽ thực thi truy vấn con của bạn dưới dạng CÂU HỎI PHỤ THUỘC, có nghĩa là truy vấn con sẽ được chạy cho mỗi hàng trong truy vấn bên ngoài. Bạn sẽ nghĩ rằng MySQL sẽ đủ thông minh để phát hiện ra rằng truy vấn con không phải là một truy vấn con tương quan và sẽ chạy nó chỉ một lần, than ôi, nó vẫn chưa thông minh như vậy.
Vì vậy, MySQL sẽ quét qua tất cả các hàng trong học sinh, chạy truy vấn con cho mỗi hàng và không sử dụng bất kỳ chỉ mục nào trên truy vấn bên ngoài.
Viết truy vấn dưới dạng JOIN sẽ cho phép MySQL sử dụng các chỉ mục và truy vấn sau đây sẽ là cách tối ưu để viết nó:
SELECT COUNT(*) AS count
FROMstudents s
JOIN classes c
ON c.id = s.classes_id
AND c.departments_id = 1
WHERE s.status = 1
Điều này sẽ sử dụng các chỉ mục sau:
Các lớpstudents(`status`)
classes(`id`, `departements_id`) : multi-column index