我创建了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