027.Mysql的in语句索引

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

对应的mybatis的sql片段如下

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

  • 确定值=,使用索引 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输出。

修改后截图如下

而下面的修改,变更了查询语义。

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

posted @ 2018-11-07 17:47  攻城狮朋友圈  阅读(2804)  评论(0编辑  收藏  举报