文档中心>云数据库 MySQL>自研内核>内核问题检查与修复>MySQL 5.7 Range Optimizer 中 SEL_ARG 红黑树操作问题

MySQL 5.7 Range Optimizer 中 SEL_ARG 红黑树操作问题

最近更新时间:2026-04-20 11:04:14

我的收藏

问题

MySQL 5.7范围查询优化器(Range Optimizer)中的 SEL_ARG 结构的红黑树(Red-Black Tree)操作存在问题,导致主库 Crash。

问题触发场景

1. 背景:MySQL 官方 Bug: #112129。
2. 表中存在多个涉及重叠列的复合索引。
3. WHERE 包含大量 IN/NOT IN/OR 嵌套条件。
4. 触发了 Range Optimizer:SELECT、EXPLAIN SELECT、UPDATE、DELETE 等均可触发。

涉及问题的内核版本

MySQL 5.7全部内核版本。

修复的内核版本

MySQL 8.0 20201230及以上版本。

修复方法

长期处理(推荐)

将内核版本升级至 MySQL 8.0 20201230或以上版本,操作方法请参考 升级 MySQL 5.7到 MySQL 8.0升级内核小版本

紧急处理

UNION ALL 拆分:将复杂的多层 OR 条件拆成多个简单子查询,用 UNION ALL 合并。每个子查询只包含 AND + IN 条件,不触发 key_or() 递归。
改写 SQL 参考:
SELECT C2 FROM(
-- 分支1: c6='V6' AND C4='25' AND C5 IN(...) AND c7='v7a'
SELECT C2 FROM t1
WHERE C2 IS NOT NULL AND C2 <>''
AND C6 IN ('V6') AND C4='25' AND C5 IN ('1238''1296'...)
AND C7 IN ('v7a')
UNION ALL
-- 分支2: c4='4' AND C5 IN(...)
SELECT C2 FROM t1
WHERE C2 IS NOT NULL AND C2 <>''
AND C4 ='4' AND 5 IN ('10135269''10144642')
UNION ALL
-- 分支3: c4='20' AND C5 IN(...)
SELECT C2 FROM t1
WHERE C2 IS NOT NULL AND c2 <>''
AND C4 ='20' AND C5 IN ('2000000085', '2000000086'...)
UNION ALL
-- 分支4-7: NOT IN 分支,同理拆分
SELECT C2 FROM t1
WHERE C2 IS NOT NULL AND c2 <>''
AND C4 ='25' AND C5 NOT IN ('1238''1296'...)
UNION ALL
-- ...其他 NOT IN 分支 ...
) AS sub;