sql优化中的陷进

在日常sql优化中,一定会碰到这样的sql:

select  id,name,t_id,status,cdate    from t1 left join t2 on t1.id=t2.id where t1.t_id in ('','','','') and t1.status = 2 order by t2.cdate desc;

如果t_id选择性比较高,则建立的索引可能是 create index idx_tid on t1(t_id);  create index idx_cdate on t2(cdate);


  这样最后的执行计划,如果驱动表t1结果集比较大,t2只有1条结果,就可能是1条驱动数万条的结果,mysql还会用到tmp table 且不会排序。这里的陷阱就在于我们如果指定T2使用idx_cdate 索引,就会消掉临时表和排序,但是如果结果集T1最后过滤的结果集很小(5000左右),但是T2会很多(数十条),mysql优化器可能无法按照原来的计划执行,始终按照指定的索引执行,可能就会多次的嵌套循环,但是此时的临时表,已经很小,排序也很小,对性能的影响也就不会很大。这种类型的sql关键在于in后的带入值无法估计,所以会造成执行计划无法很好的完成这个任务。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值