mysql小结果集驱动大结果集_sql优化之以小结果集驱动大结果集

对于关联查询,我们必须遵循一条规则,以小结果集驱动大结果集

来一条语句:

SELECT DISTINCT

bbl.lead_Id

FROM

`buyer$buying_lead` bbl,

`supplier$product` sp,

`supplier$package_record` spr,

`supplier$user` su

WHERE

sp.`supplier_id` = su.supplier_id

AND su.company_id = spr.`company_id`

AND bbl.`category_id` = sp.`category_id`

AND bbl.source <> '002'

AND bbl.`status` = 9

AND spr.`package_id` > 1

AND spr.`expire_time` > now()

AND spr.`current_package` = 1

AND TIMESTAMPDIFF(hour,bbl.modify_time,NOW())<=24

ORDER BY bbl.modify_time desc;

这条语句执行时间竟然时间长达40s,分解下语句

selectcount(*) from `buyer$buying_lead` bbl where bbl.`status` = 9

AND bbl.source <> '002'   AND

TIMESTAMPDIFF(hour,bbl.modify_time,NOW())<=24---结果集竟然只有10多行

select bbl.lead_Id from `buyer$buying_lead` bbl where bbl.`status` = 9 AND bbl.source <> '002'   AND TIMESTAMPDIFF(hour,bbl.modify_time,NOW())<=24 ----执行速度很快

SELECT count(*) from `supplier$package_record` spr where  spr.`package_id` > 1  AND spr.`current_package` = 1   AND spr.`expire_time` > now()---也只有1000行

SELECT    bbl.lead_Id  FROM   `buyer$buying_lead` bbl,     `supplier$product` sp,     `supplier$package_record` spr,    `supplier$user` su             WHERE   sp.`supplier_id` = su.supplier_id     AND su.company_id = spr.`company_id`   AND bbl.`category_id` = sp.`category_id`    AND bbl.source <> '002'      AND bbl.`status` = 9      AND spr.`package_id` > 1     AND spr.`expire_time` > now()    AND spr.`current_package` = 1      AND TIMESTAMPDIFF(hour,bbl.modify_time,NOW())<=24;----这语句需要40s,说明排序不是影响sql执行缓慢的主要原因,于是怀疑关联的顺序是否有问题

explain sql语句

H+DB5AtvsZDpAAAAAElFTkSuQmCC

优化器竟然选择了sp作为驱动表,那么我们就强行指定关联顺序straight_join

SELECT    bbl.lead_Id  FROM   `buyer$buying_lead` bbl straight_join     `supplier$product` sp,     `supplier$package_record` spr,    `supplier$user` su             WHERE   sp.`supplier_id` = su.supplier_id     AND su.company_id = spr.`company_id`   AND bbl.`category_id` = sp.`category_id`    AND bbl.source <> '002'      AND bbl.`status` = 9      AND spr.`package_id` > 1     AND spr.`expire_time` > now()    AND spr.`current_package` = 1      AND TIMESTAMPDIFF(hour,bbl.modify_time,NOW())<=24  ORDER BY bbl.modify_time desc;

执行竟然只有0.31s,跟前没优化相比,不是一个数量级的

附上执行计划:

R8HWq9rAAFkAAAAASUVORK5CYII=

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30221425/viewspace-1799967/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值