Viết truy vấn theo cách này:
SELECT *
FROM orders
JOIN users ON orders.id_user = users.id
WHERE orders.status='new'
Không chỉ định chỉ mục nào sẽ sử dụng.
Bắt đầu với WHERE
mệnh đề này có dạng như thế này might hữu ích:INDEX(status)
. Nhưng vì "trạng thái" nghe giống như một "cờ" có số lượng thấp, nên trình tối ưu hóa có thể quyết định bỏ qua chỉ mục và chỉ cần thực hiện quét bảng. Điều này không sao. Nó là OK vì quét bảng nhanh hơn so với việc trả lại giữa một chỉ mục và dữ liệu, khi chỉ mục không được chọn lọc nhiều. Trong mọi trường hợp, hãy để Trình tối ưu hóa quyết định.
Bây giờ nó đang xử lý orders
, nó cần phải JOIN
tới users
. Cách duy nhất để làm điều đó là có một chỉ mục trên id
. Tên đó ("id") ngụ ý rằng nó có thể là PRIMARY KEY
, Là nó? (Vui lòng cung cấp SHOW CREATE TABLE
.)
Truy vấn khác mà bạn đã đề cập nên được viết
SELECT * FROM users WHERE id=33
Và, như đã thảo luận, chỉ mục (PRIMARY KEY
?) trên id
là điều đúng đắn.
Không có lợi thế (đối với SELECTs
đã cho , ít nhất) cho INDEX(status, id_user)
. Lựa chọn của bạn bao gồm tất cả các cột (*
); nó chỉ được tìm nạp id_user
, thì một chỉ mục như vậy sẽ "bao trùm" và có một số lợi thế.