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.