1. 程式人生 > >in型子查詢陷阱

in型子查詢陷阱

們的 goods inner cnblogs 目的 針對 欄目 exp com

in 型子查詢引出的陷阱 select goods_id from goods where cat_id in (1,2,3) 直接用id,不包含子查詢,不會中陷阱

題: 在ecshop商城表中,查詢6號欄目的商品, (註,6號是一個大欄目)

最直觀的: mysql> select goods_id,cat_id,goods_name from goods where cat_id in (select

cat_id from ecs_category where parent_id=6);

誤區: 給我們的感覺是, 先查到內層的6號欄目的子欄目,如7,8,9,11

然後外層, cat_id in (7,8,9,11)

事實: 如下圖, goods表全掃描, 並逐行與category表對照,看parent_id=6是否成立

技術分享

原因: mysql的查詢優化器,針對In型做優化,被改成了exists的執行效果.

當goods表越大時, 查詢速度越慢.

改進: 用連接查詢來代替子查詢

explain select goods_id,g.cat_id,g.goods_name from goods as g

inner join (select cat_id from ecs_category where parent_id=6) as t

using(cat_id) \G

in型子查詢陷阱