Xem những gì EXPLAIN EXTENDED
nói.
Nếu nó cho biết DEPENDENT SUBQUERY
hoặc UNCACHEABLE SUBQUERY
, sau đó nó sẽ được đánh giá lại mỗi khi được sử dụng.
Điều này xảy ra nếu truy vấn con sử dụng các biến phiên hoặc là một truy vấn con có tương quan.
Nếu không, nó có thể sẽ được lưu vào bộ nhớ đệm.
Nếu trường hợp của bạn, truy vấn con sẽ không được lưu vào bộ nhớ đệm, nó sẽ được đánh giá lại trong mỗi UNION
'ed set.
Tuy nhiên, truy vấn con của bạn dường như quá phức tạp. Tại sao bạn không sử dụng:
SELECT id
FROM playlist_program_map ppm, programs p
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND submitter_id = 32
AND feed_id = 2478
Nếu bạn có chỉ mục trên playlist_program_map (playlist_id)
, truy vấn này sẽ hoạt động giống như một sự quyến rũ.
Bạn có thể vui lòng cho tôi biết thêm hai điều:
- Có bao nhiêu hàng trong
playlist_program_map
và có bao nhiêuDISTINCT playlist_id
có giá trị nào không?- Có bao nhiêu hàng trong
programs
và có bao nhiêuDISTINCT submitter_id, feed_id
có cặp không?
- Có bao nhiêu hàng trong
Từ nhận xét của bạn, tôi có thể kết luận rằng có 10 programs
mỗi playlist
trung bình và 200 programs
per (submitter, feed)
đôi. Điều này có nghĩa là chỉ mục của bạn trên playlist_program_map
được lựa chọn nhiều hơn so với trên (submitter, feed)
và playlist_program_map
phải dẫn đầu tham gia.
Chỉ mục toàn văn bản trong trường hợp của bạn dường như cũng không được chọn lọc cho lắm, vì bạn cần phải tham gia 10 chương trình trong số 2.000.000 .
Tốt hơn bạn có thể thử những cách sau:
SELECT object_id, programs.created AS created
FROM playlist_program_map ppm, programs p, comments_programs cp
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND p.submitter_id = 32
AND p.feed_id = 2478
AND cp.object_id = p.id
AND cp.text REGEXP 'excellent'
và lặp lại điều này cho cả ba bảng.