还是慢查询优化,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})
放在 ON
和WHERE
是有区别的。on
在笛卡尔乘积
之前,where
在笛卡尔乘积
之后。