线上某系统遇到了in查询慢的问题,而且in里面的元素只有10个,百思不得其解,接口原来1ms的响应时间,加了这个sql为何变成了200ms,随后破案了。
因为mysql有个系统参数range_eq_range_index_dive_limit,5.6版本默认为10,超过10以后可能导致走错误的执行计划,5.7默认为200,目前已知:
正常情况下我们在使用in查询的时候都会走索引,但是数据库的eq_range_index_dive_limit属性会影响mysql优化器的选择mysql官方没给出具体会受到影响的情况,但是给出了eq_range_index_dive_limit不生效的情况

  1. single-index FORCE INDEX index 唯一索引使用强制索引方式不受eq_range_index_dive_limit影响,否则受影响
  2. The index is nonunique and not a FULLTEXT index.非唯一索引和非全文索引不受eq_range_index_dive_limit影响
  3. No subquery is present. 不存在子查询的情况不受eq_range_index_dive_limit影响
  4. No DISTINCT, GROUP BY, or ORDER BY clause is present. 不存在DISTINCT、GROUP BY或ORDER BY子句不受eq_range_index_dive_limit影响
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐