我創建了2個可用於執行相同功能的查詢。它們都包含我想合併成單個查詢的屬性,但我一直無法。使用子查詢與左連接的MySQL索引優化
查詢1 - 給我的結果我想要的。慢(〜0.700秒)
查詢2 - 給我很多行,我忽略和跳過。快速(〜0.005秒)
我的目標是修改QUERY 2,爲每個項目刪除除1之外的所有空行價格行。我似乎無法完成這項工作,因爲我們對錶現不感興趣。這是由於我缺乏對MySQL中索引使用的經驗和理解。
QUERY 1
用途設計不良的子查詢不允許跨tbl_sale(e)中使用索引包含10K行。
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
這裏是解釋查詢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
全部使用左聯接,這是非常有效的(與ORDER BY除外)。索引用於每個連接。該查詢返回tbl_watch中每個項目的所有可能匹配項。下面是該查詢:
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
這裏是解釋查詢:
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
如何修改問題2(更有效)給我正是我需要像在查詢1對行與嗎?
感謝 邁克
我不太確定第一個查詢可能會給你想要的結果。左連接不是左外連接(雖然也許它在MySQL中,它不符合SQL),並且空值不是唯一值。我沒有方便的MySQL,但把它放到PostgreSQL中並沒有給出你描述的結果。我的回答如下... – PlexQ