mysql索引优化后如何验证效果_mysql性能测试方法

发布时间 - 2026-02-01 00:00:00    点击率:
必须用EXPLAIN确认索引是否实际生效,重点看type、key、rows;结合慢日志、performance_schema、sysbench压测及InnoDB缓冲池指标综合验证优化效果。

EXPLAIN 看执行计划是否真的走了新索引

加了索引不等于用了索引,必须确认查询实际走的是你建的那条。在 SELECT 语句前加 EXPLAIN,重点看 type(越靠前越好,ref/rangeALL 强)、key(是否显示你新建的索引名)、rows(预估扫描行数是否显著下降)。

常见误判点:

  • key 为空或显示其他索引名 → 索引未命中,可能是 WHERE 条件没覆盖索引最左前缀,或存在隐式类型转换(比如字符串字段用数字比较)
  • rows 和表总行数接近 → 实际还是全表扫描,索引可能失效或选择性太低
  • 用了 ORDER BYExtra 出现 Using filesort → 排序无法利用索引,需检查是否能把排序字段加入联合索引末尾

SLOW_LOGperformance_schema 抓真实慢查询

开发环境 EXPLAIN 看得再好,也代替不了线上真实流量下的表现。开启 MySQL 慢查询日志,设置 long_query_time = 1(甚至 0.5),让业务跑一段时间后分析日志:

  • mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log 找出耗时 top 10 的语句
  • 对比优化前后同一 SQL 的平均执行时间、锁等待次数、扫描行数(Rows_examined
  • 启用 performance_schema 后,查 events_statements_summary_by_digest 表,能按指纹聚合统计,避免被参数化差异干扰

注意:不要只看单次执行时间,要关注 P95/P99 延迟和抖动——有些 SQL 平均快了,但偶发卡顿更严重,可能是因为索引导致回表放大或锁竞争加剧。

sysbench 做可控压测对比

想量化索引优化收益,就得控制变量压测。用 sysbench 跑相同数据量、相同并发、相同读写比例的 OLTP 场景:

  • 先用 sysbench oltp_read_write --tables=16 --table-size=1000000 prepare 初始化数据
  • 分别对原表和加索引后的表执行 run,记录 queries per secondlatency (avg/max)
  • 关键要看 95th percentile latency 是否下降,以及 MySQL Threads_running 峰值是否降低 —— 后者反映锁/IO压力是否缓解

容易忽略的一点:sysbench 默认用主键范围扫描,如果你优化的是非主键字段,得自定义 Lua 脚本把 WHERE 条件改成目标字段,否则压测根本打不到新索引上。

监控 InnoDB_buffer_pool_readsHandler_read_* 指标

索引优化最终要落到 IO 和内存效率上。观察以下两个关键指标的

变化:

  • InnoDB_buffer_pool_reads:每秒从磁盘读取页的次数。优化后该值应明显下降,说明更多数据从 buffer pool 命中
  • Handler_read_next vs Handler_read_rnd_next:前者是索引有序扫描,后者是随机回表读行。如果后者大幅减少,说明减少了不必要的回表操作

这些指标在 SHOW GLOBAL STATUS 里查,建议在压测前后各采样一次,计算差值比。别只盯 QPS 上升——有时候 QPS 没变,但 buffer pool hit rate 从 92% 升到 99%,这才是索引真正起效的信号。


# mysql  # ai  # 性能测试  # 开发环境  # mysql索引  # 隐式类型转换  # lua  # sql  # select  # 字符串  # using  # var  # 类型转换  # 并发  # table  # 执行时间  # 行数  # 用了  # 的是  # 主键  # 如果你  # 是因为  # 走了  # 看得  # 要看 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 闭包写法详细介绍  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Thinkphp 中 distinct 的用法解析  独立制作一个网站多少钱,建立网站需要花多少钱?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  BootStrap整体框架之基础布局组件  浅谈redis在项目中的应用  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何基于云服务器快速搭建个人网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何在服务器上配置二级域名建站?  javascript中对象的定义、使用以及对象和原型链操作小结  如何在自有机房高效搭建专业网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  详解Huffman编码算法之Java实现  Laravel怎么清理缓存_Laravel optimize clear命令详解  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  大型企业网站制作流程,做网站需要注册公司吗?  Laravel如何处理和验证JSON类型的数据库字段  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在阿里云通过域名搭建网站?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  中山网站推广排名,中山信息港登录入口?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何在云主机快速搭建网站站点?