027.Mysql的in语句索引

还是慢查询优化,mysql 5.7上抓到一个5s的查询,没有走到合理的索引。
718474-20181107170909544-1887626738.png

对应的mybatis的sql片段如下
718474-20181107170516799-686397846.png

复杂的动态查询,没有分而治之,搞的组合条件。
结论性的规则,如下:

  • 确定值=,使用索引 track_num = (SELECT ... limit 1)
  • 字面量IN,使用索引 in (1,2,3)
  • 子查询IN,不使用索引 receiver_id IN (SELECT ... )

优化 sql,使用 left join 代替 子查询IN,优化后,执行时间 0.3s,
开启<setting name="logImpl" value="STDOUT_LOGGING"/>,确认SQL输出。

修改后截图如下

718474-20181112125431447-1365753622.png

而下面的修改,变更了查询语义。
718474-20181107174301123-167349657.png

注意 AND (name = #{value} OR phone = #{value}) 放在 ONWHERE是有区别的。
on笛卡尔乘积之前,where笛卡尔乘积之后。

转载于:https://www.cnblogs.com/moilioncircle/p/code-review-027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值