Có vẻ như vì một số lý do, MySQL chọn sử dụng chỉ mục SIL trên bảng đầu tiên và nó sử dụng cả nó để tra cứu (WHERE sil_id = 4601038 ) và phân nhóm (GROUP BY cu.Id ).
Bạn có thể yêu cầu nó sử dụng PK của bảng
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
và nó sẽ tạo ra kế hoạch thực thi này:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+-------+---------------+---------+---------+------------------+------+-------------
1 | SIMPLE | cu | index | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
Bỏ qua các giá trị được báo cáo trong cột rows ; chúng không đúng vì bảng của tôi trống.
Lưu ý Extra cột bây giờ chỉ chứa Using where nhưng cũng lưu ý rằng tham gia type cột đã thay đổi từ ref (rất tốt) thành index (quét toàn bộ chỉ mục, không khá tốt).
Giải pháp tốt hơn là thêm chỉ mục vào cột SIL_Id . Tôi biết, SIL_Id là tiền tố của chỉ mục SIL(SIL_Id, AsCatId) và về lý thuyết, một chỉ mục khác trên cột SIL_Id là hoàn toàn vô ích. Nhưng có vẻ như nó giải quyết được vấn đề trong trường hợp này.
ALTER TABLE cat_urls
ADD INDEX (SIL_Id)
;
Bây giờ hãy sử dụng nó trong truy vấn:
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
Kế hoạch thực thi truy vấn hiện có vẻ tốt hơn nhiều:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+------+---------------+--------+---------+------------------+------+-------------
1 | SIMPLE | cu | ref | SIL_Id | SIL_Id | 4 | const | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
Hạn chế là chúng ta có thêm một chỉ số (về mặt lý thuyết) là vô dụng. Nó chiếm không gian lưu trữ và nó tiêu thụ các chu kỳ của bộ xử lý mỗi khi một hàng được thêm, xóa hoặc có SIL_Id của nó trường đã sửa đổi.