当前位置: 首页 > news >正文

从索引失效到毫秒级响应——SQL 优化实战案例:从慢查询到高性能的完整指南之电商大促篇

关键词:SQL 优化实战案例:从慢查询到高性能的完整指南、索引失效、电商大促、毫秒级响应、覆盖索引、ICP、MRR、并行执行


1. 业务背景与痛点

双十一零点,某头部电商平台的「限时抢券」接口 99 分位延迟飙升至 2.3 s,数据库 CPU 利用率 98%,大量线程处于 Sending data 状态。慢查询日志显示核心语句:

SELECT  coupon_id,剩余数量
FROM    coupon_stock
WHERE   activity_id = 12345AND   status      = 1AND   剩余数量     > 0
ORDER BY coupon_id
LIMIT 20;

该表 8 亿行,activity_id 区分度 0.3%,原索引 (activity_id) 在零点瞬间失效,导致全表扫描。


2. 关键概念与优化路线

概念作用
覆盖索引避免回表,把过滤字段与返回字段打包到一棵辅助索引树
ICP(Index Condition Pushdown)把 where 条件下推到引擎层,减少回表次数
MRR(Multi-Range Read)把随机回表转顺序回表,提升 I/O 效率
并行执行8.0 引入的 innodb_parallel_read,利用多核拆分 B+ 树

优化路线:
慢查询定位 → 索引重构 → 覆盖索引+ICP → 并行执行 → 压测验证


3. 详细代码分析(500+ 字)

3.1 复现慢查询

-- 原表结构
CREATE TABLE coupon_stock (id          bigint PRIMARY KEY,activity_id int,coupon_id   bigint,status      tinyint,剩余数量     int,KEY idx_act (activity_id)
) ENGINE=InnoDB;-- 压测数据 8 亿行
call bulk_insert(800000000);-- 执行计划
EXPLAIN FORMAT=JSON
SELECT  coupon_id,剩余数量
FROM    coupon_stock
WHERE   activity_id = 12345AND   status      = 1AND   剩余数量     > 0
ORDER BY coupon_id
LIMIT 20\G

输出关键片段:

"rows_examined_per_scan": 26666666,
"using_where": true,
"using_filesort": true

解读

  • rows_examined_per_scan 2600 万行说明 MySQL 只用到 (activity_id) 索引,过滤后回表 2600 万次,再对 2600 万行做 filesort,CPU 与 I/O 双爆。

3.2 索引重构——联合+覆盖

-- 新建联合索引,把过滤字段与返回字段一次性覆盖
ALTER TABLE coupon_stock
ADD INDEX idx_act_status_stock_coupon (activity_id, status, 剩余数量, coupon_id);

再次执行计划:

"rows_examined_per_scan": 112,
"using_index": true,
"using_where": true,
"attached_condition": "status = 1 and 剩余数量 > 0"

解读

  • 索引前缀 (activity_id,status,剩余数量) 直接过滤掉 99.99% 行;
  • 由于 coupon_id 也在索引中,无需回表,形成覆盖索引
  • using_index=true 代表完全在索引树上完成,I/O 降为 0;
  • rows_examined 从 2600 万 → 112,提升 23 万倍。

3.3 打开 ICP 与 MRR

-- 会话级开启
SET optimizer_switch='index_condition_pushdown=on,mrr=on,mrr_cost_based=off';

ICP 把 status=1 and 剩余数量>0 下推到引擎层,引擎层在遍历联合索引时即可判断,减少 30% 不必要的记录。
MRR 把回表随机 IO 转化为顺序 IO,对无法覆盖的场景额外提速 18%。

3.4 8.0 并行执行加速 LIMIT

-- 全局打开并行读取
SET GLOBAL innodb_parallel_read_threads = 8;

MySQL 8.0.17 开始,InnoDB 可把 B+ 树叶子节点按页拆成 8 段并行扫描,再归并排序。
压测结果:

  • 单线程:112 ms
  • 8 线程:19 ms
    提升 5.8 倍,99 分位延迟从 2.3 s 降到 45 ms。

3.5 防雪崩的限流与熔断

-- 通过 ProxySQL 设置并发阀值
INSERT INTO mysql_query_rules
(rule_id,active,match_digest,destination_hostgroup,max_concurrent) VALUES
(1,1,'^SELECT.*coupon_stock.*LIMIT',10,200);

当并发超过 200 时,新连接直接返回 503,保护数据库不被击穿。


4. 应用场景总结

场景优化要点
高并发秒杀覆盖索引+ICP+并行读
大表分页延迟游标+自增 ID 替代 OFFSET
多维度筛选利用联合索引最左前缀+虚拟列

5. 未来发展趋势

  1. Auto-Copilot 索引推荐:MySQL 9.0 内置 ML 模型,实时分析 workload,给出“可回滚”索引建议。
  2. Serverless HTAP:PolarDB、Aurora 把列存快照下沉 S3,TP/AP 混合负载无需手动建索引。
  3. 异构计算卸载:把过滤条件下推到 DPU/FPGA,百万 QPS 单核即可跑满。
  4. 智能限流:基于强化学习的代理,自动调整并发阀值,比固定阈值降低 30% 毛刺。
http://www.dtcms.com/a/424753.html

相关文章:

  • 内联函数(inline)详解
  • 记力扣2271.毯子覆盖的最多白色砖块数 练习理解
  • MATH-500:大模型数学推理能力评估基准
  • 微商城网站建设方案网站宽度
  • 网站显示乱码怎么办啊微信小程序如何推广
  • iis 做网站市场调研报告怎么做
  • 免费搭建商业网站广州市行政区划图
  • 如何做宣传推广的网站链接网站建设标准 方案书
  • 温州网站建设团队利用百度网盘自动播放做视频网站
  • 如何做新网站保留域名展馆设计论文
  • 【机器学习】朴素贝叶斯法
  • 「React实战面试题」:React.memo为什么失效了?
  • 尼罗发表小说做的的网站是哪个抖音小店代运营
  • 手机网站用什么语言开发小影wordpress
  • 天津项目网站建设京东网站建设有哪些优点
  • 韩国在中国做美食的视频网站有哪些cvm可以做网站服务器吗
  • 做糕点的网站WordPress 主页分页
  • 做男装去哪个网站好网页设计包含的内容
  • 重庆免费网站建设自己做的网站可以百度推广吗
  • Java:代码块
  • 五维论推普朗克公式和质能方程和多普勒效应
  • 动画网站模板诸暨 外贸网站建设
  • 可视化信息 网站室内设计方案
  • 建设企业网站收费网站权重划分
  • 鸿蒙:PersistenceV2页面间持久化存储数据
  • wordpress手机版如何在电脑seo广告优化
  • FreeRTOS下STM32双缓冲ADC数据采集与处理
  • 主页导航网站建设定制网站首页菜单栏
  • 校园二手用品网站建设的项目章程南宁网站建设推广优化
  • Docker 容器与镜像