首页 游戏 软件 排行 专题

执行计划揭出12万行查询绕过联合索引的原因

来源: 本站整理 日期:2026/11/13 15:16:30

某电商订单表有120万行,后台按 status 和 created_at 查询近7天数据,接口却在高峰期扫描整表。明明建过索引,为什么仍没走?排查应从执行计划入手,核对字段类型、联合索引顺序、索引选择性和统计信息,并用扫描行数与耗时验证。

如果你正在选机器,或者想先把线路和配置跑通再谈长期方案,可以先看看这几家的线路说明和技术参数:hidemyacc(海外服务器),先看清带宽线路、流量策略和退款条款,再决定要不要迁。

一、先从执行计划确认索引是否命中

对同一组参数执行 EXPLAIN 和 EXPLAIN ANALYZE:前者看估算方案,后者实际运行并给出真实行数与耗时。不能只看索引名,全索引扫描也可能昂贵;应记录访问类型、候选键、预计行数、过滤比例和 Extra。若预计50行、实际读取12万行,说明估算失真;访问类型为 ALL 且 key 为空时,先验证索引能否覆盖谓词。

执行计划揭出12万行查询绕过联合索引的原因

复现时固定快照、隔离级别和参数值,运行原查询、去掉 ORDER BY 的查询及候选索引查询,保存计划与耗时。LIMIT 会让扫描提前停止,空表也会掩盖问题,样本量应接近生产;随身服务器可保存脱敏数据和计划输出,供团队按相同条件复跑。

二、逐项核对类型、索引顺序与统计信息

先查字段类型。假设 status 是数字字符串的 VARCHAR,应用却传入整数1,比较时可能发生隐式类型转换。转换索引列会破坏有序性,转换常量通常仍可利用索引,因此要确认转换发生在哪侧、业务值是否等价。统一参数类型可消除歧义;不要对索引列直接使用 CAST、TRIM 或日期函数,否则普通索引往往无法定位。

执行计划揭出12万行查询绕过联合索引的原因

再查联合索引顺序与索引选择性。对 (status, created_at),status 等值过滤后接 created_at 范围过滤,通常符合最左前缀;若只有范围条件,后续列难以缩小扫描区间。选择性表示条件保留的数据比例,不能总把高选择性列放首位:等值列可结合选择性排序,范围列通常置于其后,并核对 ORDER BY、GROUP BY 能否利用索引顺序。

最后查统计信息。批量导入或分布突变后,旧统计可能错误估计命中行数,影响索引与连接顺序。更新统计后,用相同参数重跑 EXPLAIN ANALYZE,对照预计行数、实际行数、扫描量和耗时;差距明显时检查采样比例、倾斜值与直方图。优化顺序是统一类型、调整联合索引、更新统计、再次复测,并保存前后计划,确认没有新增冗余索引。

联合索引:不能只看列的数量

联合索引要按最左前缀分析。观察执行计划中的 key_len、Using index 与 Using where:等值条件通常可向右匹配;出现范围条件后,后续列多只能过滤,不能继续缩小扫描区间。排序方向与索引相反时,还可能产生额外扫描或 filesort。

例如索引(a,b,c),where a=1 and c=3 能用 a 定位,却难用 c 缩小范围;补上 b 的等值条件,才更可能完整利用索引。但优化器会结合索引选择性与成本选择计划,不能机械追求“形式完整”。索引列参与函数或运算,如 date(create_time)=...,也可能失效;优先改写为范围条件,无法改写时再评估函数索引或生成列索引。

还要警惕反向查询、OR 两侧索引不一致,以及索引列被函数包裹。执行计划出现 Index Scan,也不代表效率高;它可能扫描大量索引行再回表,应结合扫描行数、耗时和回表次数判断。

执行计划揭出12万行查询绕过联合索引的原因

统计信息与隐式转换:计划为何突然改变

执行计划会随数据分布改变。统计信息过期会导致优化器误判选择性,选错连接顺序或扫描方式。同一 SQL 时快时慢,先更新统计信息、重新采集计划,再核对直方图、采样比例、索引基数和参数,避免在生产库反复用 hint 试错。

隐式类型转换是另一类坑:字符串列与数字比较时,部分数据库会把常量转成列类型,导致索引无法匹配;字符集、排序规则不一致也会影响使用。应对比参数与列的类型、字符集及排序规则,并用强制索引实验确认“能否走索引”和“优化器是否选择索引”。分析线上慢查询还要固定参数,比较估算与实际行数,并结合锁、I/O 和等待事件排除非索引瓶颈。

最终可按这份检查清单落地:①确认 SQL、绑定参数与出现频率;②查看 EXPLAIN 或 EXPLAIN ANALYZE 的执行计划;③核对访问类型、key_len、估算与实际行数;④检查联合索引顺序、范围条件和覆盖情况;⑤排查函数、运算及隐式类型转换;⑥更新并检查统计信息;⑦确认索引存在性、碎片和空间;⑧在压测环境比较改写前后的计划、扫描行数与耗时。一次只改变一个因素,以稳定监控结果决定是否调整 SQL 或保留索引,避免用“加万能索引”代替根因分析。

玩家留言 跟帖评论
查看更多评论
相关文章
猜你喜欢
同类下载