Tôi đã tạo 2 truy vấn mà tôi có thể sử dụng để thực hiện cùng một chức năng. Cả hai đều chứa các thuộc tính mà tôi muốn hợp nhất thành một truy vấn nhưng tôi không thể.Tối ưu hóa chỉ mục MySQL với Truy vấn con và So khớp trái
QUERY 1 - Cung cấp cho tôi chính xác kết quả tôi muốn. Chậm (~ 0.700 giây)
QUERY 2 - Cung cấp cho tôi nhiều hàng mà tôi bỏ qua và bỏ qua. Nhanh (~ 0,00 giây)
Mục tiêu của tôi là sửa đổi QUERY 2 để thả tất cả các hàng giá rỗng trừ 1 cho mỗi mục. Tôi dường như không thể làm điều này với việc tham gia vào buổi biểu diễn. Điều này là do tôi thiếu kinh nghiệm và hiểu biết về việc sử dụng chỉ mục trong MySQL.
QUERY 1
Sử dụng một subquery thiết kế kém mà không cho phép việc sử dụng các chỉ mục trên tbl_sale (e) trong đó có 10k hàng.
SELECT b.id, b.sv, b.description, der.store_id, f.name, der.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN (
SELECT c.store_id, d.flyer_id, e.item_id, e.price
FROM tbl_storewatch AS c, tbl_storeflyer AS d
FORCE INDEX (storebeg_ndx) , tbl_sale AS e
WHERE c.user_id = '$user_id'
AND (
d.store_id = c.store_id
AND d.date_beg = '20121206'
)
AND e.flyer_id = d.flyer_id
) AS der ON a.item_id = der.item_id
LEFT JOIN tbl_store as f ON der.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
Dưới đây là giải thích cho QUERY 1
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ref user_item_ndx user_item_ndx 4 const 30 Using index; Using temporary; Using filesort
1 PRIMARY b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 300
1 PRIMARY f eq_ref PRIMARY PRIMARY 4 der.store_id 1
2 DERIVED c ref user_ndx user_ndx 4 6
2 DERIVED e ALL NULL NULL NULL NULL 9473 Using join buffer
2 DERIVED d eq_ref storebeg_ndx storebeg_ndx 8 c.store_id 1 Using where
QUERY 2
Sử dụng tất cả trái tham gia mà rất hiệu quả (với ngoại lệ của ORDER BY). Các chỉ mục được sử dụng trên mỗi lần tham gia. Truy vấn này trả về tất cả các kết quả phù hợp có thể cho mỗi mục trong tbl_watch. Dưới đây là các truy vấn:
SELECT b.id, b.sv, b.description, c.store_id, f.name, e.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN tbl_storewatch AS c ON c.user_id = '$user_id'
LEFT JOIN tbl_storeflyer AS d ON d.store_id = c.store_id
AND d.date_beg = '$s_date'
LEFT JOIN tbl_sale AS e ON e.item_id = a.item_id
AND e.flyer_id = d.flyer_id
LEFT JOIN tbl_store as f ON d.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
Sau đây là giải thích cho truy vấn:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref user_item_ndx user_item_ndx 4 const 6 Using index; Using temporary; Using filesort
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 SIMPLE c ref user_ndx user_ndx 4 const 2
1 SIMPLE d eq_ref storebeg_ndx,storendx storebeg_ndx 8 c.store_id,const 1
1 SIMPLE e eq_ref itemflyer_ndx itemflyer_ndx 8 a.item_id,d.flyer_id 1
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 d.store_id 1
Làm thế nào tôi có thể sửa đổi QUERY 2 (hiệu quả hơn) để cho tôi chỉ là hàng tôi cần như trong QUERY 1 tới làm việc với?
Cảm ơn Mike
Tôi không thực sự chắc chắn về khả năng truy vấn đầu tiên cung cấp cho bạn những gì bạn muốn. Phép nối trái không phải là một phép nối ngoài bên trái (mặc dù có lẽ nó là trong MySQL, nó không tuân thủ SQL), và các giá trị rỗng không phải là các giá trị duy nhất. Tôi không có MySQL tiện dụng, nhưng thả nó vào PostgreSQL không đưa ra kết quả mà bạn mô tả. Câu trả lời của tôi dưới đây ... – PlexQ