问题描述
现象如下,数据库内核版本:8.0.18,一般常见于老版本实例。
- 同一条SQL,在只读节点和主节点实例执行时,IN 条件过多时,会导致返回记录为0。
- 在实例中执行一个Select 查询时,会发现当 IN 条件为3-4个时,正常返回数据,但是一旦 IN 内的条件过多,达到10多个之后,就没有记录返回。
原因分析
- 索引失效与执行计划变化
当IN列表过长时,MySQL可能放弃使用索引转为全表扫描,同时优化器会基于成本估算调整执行计划,可能导致统计信息不准确而返回错误结果。
- 内存限制与临时表问题
大IN列表会消耗大量内存,若超过 tmp_table_size 或 max_heap_table_size 限制,MySQL会转为磁盘临时表,可能引发性能下降或结果异常。
- 版本特定缺陷
早期MySQL 8.0可能存在查询优化器缺陷,例如对长IN列表的基数估算错误,导致错误过滤数据。建议检查具体版本的已知BUG记录。
答案内容
- 参考:eq_range_index_dive_limit 调优建议,调整eq_range_index_dive_limit参数值为100。MySQL官网参考
- 调整参数或者分批执行查询(如每批10个值)后合并结果。
- 升级到最新稳定版MySQL 8.0,此类问题在后续版本中已优化。