0

0

mysql执行计划的选择标准是什么_mysql优化策略解析

P粉602998670

P粉602998670

发布时间:2026-02-24 12:00:02

|

932人浏览过

|

来源于php中文网

原创

真正关键的四列是type、key、rows、extra:type反映访问类型优先级,key显示是否用索引,rows预估扫描行数,extra揭示临时表或文件排序等性能隐患。

mysql执行计划的选择标准是什么_mysql优化策略解析

怎么看 EXPLAIN 输出里真正关键的几列

MySQL 优化不是看 EXPLAIN 能不能跑出结果,而是盯住 typekeyrowsExtra 这四列。它们直接暴露查询是否走索引、扫描了多少行、有没有临时表或文件排序。

常见错误是只扫一眼 type 是不是 refrange 就放心,其实 rows 高到几万,说明索引没选对或者条件过滤性差;Extra 出现 Using filesortUsing temporary 基本等于性能红灯。

  • type 优先级: consteq_ref > ref > range > index > ALL(全表扫描)
  • key 为空?说明没用上索引,哪怕表上有索引,也可能因隐式类型转换、函数包裹字段(如 WHERE YEAR(created_at) = 2023)导致失效
  • rows 不是精确值,是预估,但数量级错得离谱(比如查 10 行却显示 10000)往往意味着统计信息过期,可运行 ANALYZE TABLE
  • ExtraUsing index 是好信号(覆盖索引),但 Using index condition 才是 MySQL 5.6+ 的真正优化点,表示下推了部分 WHERE 条件到存储引擎层

联合索引顺序为什么不能随便调换

联合索引 (a, b, c) 不等于 (b, a, c),更不等于三个单列索引之和。MySQL 的 B+ 树索引按定义顺序排序,只能高效支持“最左前缀匹配”。

典型误用场景:给 WHERE b = ? AND c = ? 建了 (a, b, c) 索引,结果还是全表扫描——因为没用上最左列 a,整个索引就废了。

  • 等值查询 + 范围查询混用时,范围列之后的字段无法走索引: WHERE a = 1 AND b > 10 AND c = 5 只能用上 abc 不会参与索引查找
  • 排序需求要和索引顺序严格一致: ORDER BY a, b 能用 (a, b),但 ORDER BY b, a 就不行
  • 区分度高的列建议放左边,但别为了“高区分度”牺牲查询模式:比如经常查 status = 'paid' 再加时间范围,status 区分度低,但放左边反而能让更多查询命中索引

FORCE INDEX 什么时候该用、什么时候是掩耳盗铃

强制指定索引不是银弹,它只是绕过优化器的“自作聪明”,但掩盖不了底层设计问题。用之前先确认:是不是统计信息不准?是不是写法触发了优化器误判?

Hotpot.ai
Hotpot.ai

AI工具箱(图像、游戏和写作系列工具)

下载

真实报错场景:SELECT ... FROM orders WHERE user_id = ? ORDER BY created_at DESC LIMIT 20,明明有 (user_id, created_at) 索引,却走了全表扫描 + filesort——可能是因为 user_id 值分布极不均匀(比如大量测试数据全是同一个 ID),让优化器误以为走索引不如扫表快。

  • 临时救急可用:SELECT ... FROM t FORCE INDEX (idx_user_time) WHERE ...,但必须配上监控,确认执行计划稳定且 rows 合理
  • 长期依赖 FORCE INDEX 通常说明表结构或查询逻辑有问题:比如缺少合适的联合索引,或 WHERE 条件里用了无法走索引的表达式
  • MySQL 8.0+ 支持优化器提示(hints),比 FORCE INDEX 更细粒度,例如 /*+ USE_INDEX(t idx_user_time) */,但同样不能替代索引设计

为什么加了索引查询反而变慢

索引不是越多越好,也不是建了就一定生效。最常被忽略的是:索引本身要占磁盘、内存,写操作(INSERT/UPDATE/DELETE)都要维护索引树,而读性能提升的前提是“查询真能走索引且收益大于开销”。

一个典型反例:给 gender 列(只有 'M'/'F')单独建索引,查询 WHERE gender = 'M' 时,MySQL 认为走索引要随机 IO 查几千页,不如直接扫表——于是弃用索引,你还以为建了就有用。

  • 单列低区分度字段(如状态码、开关位)单独建索引,大概率被优化器忽略
  • 大字段(如 TEXT、长 VARCHAR)做索引前缀长度不够,会导致索引失效或重复率过高
  • 频繁更新的字段建索引,会显著拖慢写入性能,尤其在高并发写场景下,B+ 树分裂和缓冲池压力都会放大
  • 复合索引中包含太多列(比如 5 列以上),不仅增大索引体积,还容易因查询条件未覆盖最左前缀而完全失效

索引好不好,得看 EXPLAIN 里的 keyrows,而不是看 SHOW INDEX 里有没有那行记录。很多人调优卡在第一步,就是没把这两列盯准。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

681

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

412

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

286

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

264

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

538

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

639

2023.08.14

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

2

2026.02.24

热门下载

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

精品课程

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

共48课时 | 2.3万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 836人学习

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

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