0

0

mysql如何通过explain优化索引_mysql实战调优

P粉602998670

P粉602998670

发布时间:2026-02-04 10:05:02

|

593人浏览过

|

来源于php中文网

原创

最关键看 rows 和 filtered 的乘积,它近似代表 MySQL 实际扫描的行数;其次关注 Extra 是否出现 Using filesort 或 Using temporary,key_len 是否符合预期,以及隐式类型转换导致 key 为空。

mysql如何通过explain优化索引_mysql实战调优

EXPLAIN 输出里哪些字段最关键

EXPLAIN 结果,别只盯着 typekey,真正决定性能的是 rowsfiltered 的乘积——它近似代表 MySQL 实际扫描的行数。比如 rows=10000filtered=10.00(即 10%),意味着大概要检查 1000 行;但如果 filtered 是 0.1,那就得筛 10 行——差别巨大。

常见误判:看到 type=ref 就以为没问题,但若 rows 是百万级,说明索引没过滤掉多少数据,可能需要更选择性的索引或调整查询条件顺序。

  • key 为空?说明没走索引,先查 possible_keys 是否有候选,再确认 WHERE 条件是否符合最左前缀原则
  • Extra 出现 Using filesortUsing temporary?大概率是排序/分组字段没被索引覆盖,需加联合索引
  • key_len 比预期小?比如定义了 INDEX(a,b,c),但 key_len 只显示 a 的长度,说明 b/c 没参与索引查找——通常因为 WHERE 中跳过了 b

联合索引怎么建才不浪费

联合索引不是字段堆砌,而是按「过滤性 + 查询频率 + 排序需求」排优先级。高区分度字段(如 user_id)放前面,低区分度(如 status)放后面;等值查询字段优先于范围查询字段(WHERE a=1 AND b>100 → 索引应为 (a,b),不能是 (b,a))。

容易踩的坑:ORDER BY 字段必须紧接在 WHERE 等值字段之后,才能复用索引避免 Using filesort。例如 WHERE category=2 AND is_valid=1 ORDER BY created_at DESC,索引应为 (category, is_valid, created_at),而不是 (category, created_at, is_valid)

  • 字符串字段加索引要控制长度:VARCHAR(255) 不必全字段索引,INDEX(title(191)) 足够应对多数场景,还能节省 B+ 树层级
  • 避免冗余索引:INDEX(a)INDEX(a,b) 同时存在时,前者基本无效,删掉
  • 日期范围慎用:对 created_at > '2023-01-01' 单独建索引效果差,应结合高选择性字段组成联合索引

为什么 force index 有时反而更慢

FORCE INDEX 是告诉优化器“必须用这个索引”,但它不解决底层数据分布问题。如果该索引的 rows 预估远高于实际最优路径(比如统计信息过期),强制使用只会让执行计划更糟。

幻舟AI
幻舟AI

专为短片创作者打造的AI创作平台

下载

典型场景:表刚导入大量数据,但没 ANALYZE TABLE,优化器仍按旧统计估算,此时 FORCE INDEX 可能锁死在低效路径上;或者索引本身覆盖不全,导致回表次数爆炸(Extra 出现大量 Using where + 高 rows)。

  • 先跑 ANALYZE TABLE table_name 更新统计信息,再看 EXPLAIN 是否自动选对索引
  • SELECT * FROM table_name WHERE ... 对比 SELECT id FROM table_name WHERE ...EXPLAIN,判断是否因回表成本过高导致优化器弃用索引
  • FORCE INDEX 仅用于临时验证,上线前务必还原并靠索引设计和统计信息解决根本问题

慢查询里隐式类型转换怎么揪出来

当 WHERE 条件字段是 VARCHAR,但传入数字(如 WHERE phone = 13812345678),MySQL 会把整列转成数字比较,导致索引失效——EXPLAINkey 为空,type 变成 ALL

这种问题在 ORM 自动生成 SQL 时特别隐蔽,比如 MyBatis 把 Java Long 直接拼进字符串条件,或前端传参没加引号。检查方法很简单:把慢查询日志里的 SQL 拿到 MySQL 客户端执行,再 EXPLAIN,重点看 typekey 是否异常。

  • 统一用字符串传参:WHERE phone = '13812345678'
  • 建表时尽量让字段类型和业务输入一致,避免 INT 存手机号(后期想加前缀就崩溃)
  • SHOW WARNINGS 查看隐式转换警告,MySQL 8.0+ 会在警告中明确提示 “Cast to type …”

实际调优中,90% 的索引问题出在联合索引字段顺序、字符串字段未截取长度、以及隐式类型转换这三处。只要每次写完查询都扫一眼 EXPLAINrowsExtra,就能避开大部分线上性能雷区。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

813

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1366

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

365

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

943

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

427

2024.04.29

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 821人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号