0

0

Mysql -- 执行计划介绍_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:12:54

|

1055人浏览过

|

来源于php中文网

原创

一、序言

       作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题。关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们可以通过执行计划对SQL进行分析,能快速找到优化的地方,这是一种很不错的方式,介绍给大家,大部分我是翻译而来,原文地址:http://dev.mysql.com/doc/refman/5.6/en/explain-output.html

二、执行计划输出列的含义:

    

Column Meaning
id The SELECT identifier
select_type The SELECT type
table The table for the output row
partitions The matching partitions
type The join type
possible_keys The possible indexes to choose
key The index actually chosen
key_len The length of the chosen key
ref The columns compared to the index
rows Estimate of rows to be examined
filtered Percentage of rows filtered by table condition
Extra Additional information

● id

   查询的标识,表示在select 执行语句中的顺序(PS:数字越大,优先执行)。如果这行是和其他行合并的结果,这个值可以为null。比如:使用 UNION 关键字,将多个select 的结果合并到一起。

● select_type:每个select 的类型。

select_typeMeaning
SIMPLE 简单的 SELECT (没有 使用UNION 或者 子查询(PS:单表查询))
PRIMARY 最外层的Select 作为primary 查询。(PS:含有子查询的情况,但是并不复杂)
UNION 从第二个或者在union 之后的select 作为 union 查询
DEPENDENT UNION 从第二个或者在union 之后的select 作为 union 查询, 依赖于外部查询
UNION RESULT 结果集是通过union 而来的,作为...
SUBQUERY 第一个查询是子查询
DEPENDENT SUBQUERY 第一个查询是子查询,依赖于外部查询
DERIVED 在from 查询语句中的(派生,嵌套很多)子查询.(PS:递归操作这些子查询)
MATERIALIZED (雾化) 子查询(PS:子查询是个视图?)
UNCACHEABLE SUBQUERY 子查询结果不能被缓存, 而且必须重写(分析)外部查询的每一行
UNCACHEABLE UNION 第二个 或者 在UNION 查询之后的select ,属于不可缓存的查询

● Table:输出所用到的表(PS:通过id 联系) 

● Type:连接类型,很重要的分析手段,下面按最优到最差排序:

   System:表只有一行(=系统表),const 的特例

   const:表查询结果最多只有一行,因为只有一行,该查询优化部分一般是常数。比如根据主键id=1 查询。

   比如:

SELECT * FROM tbl_name WHERE primary_key=1;

   eq_ref:从当前这个表读出的一行,和前面所有表的行进行组合,这是除了const 和system 外,最好的连接类型,它是用于所有的都是用唯一索引去连接被主键或者不为空的索引。常用=操作符比较索引

    比如:

    

SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

   ref:用于连接非唯一索引的扫描。可以对索引的列使用> = 的操作符。

    比如: 

SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

     

ref_table

    

     fulltext: 该方式使用的是全文检索

       ref or null : 该连接方式像ref,但是包含null 的值 ,该连接类型主要是解决子查询

       比如:

SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

    index_merge:索引合并优化(PS:多个索引条件情况,进行条件的合并优化)

      

我版本低,没出现。。,可以参考下面解释:http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.htmlSELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;SELECT * FROM tbl_nameWHERE (key1 = 10 OR key2 = 20) AND non_key=30;SELECT * FROM t1, t2WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')AND t2.key1=t1.some_col;SELECT * FROM t1, t2WHERE t1.key1=1AND (t2.key1=t1.some_col OR t2.key2=t1.some_col2);

   

    unique_subquery:这个参照ref,处理子查询

    比如:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

   index_subquery:这个和unique_subquery 类似,取代非唯一索引的子查询

    比如:

value IN (SELECT key_column FROM single_table WHERE some_expr)

   range:只有在range 范围内的都被检索,只用索引才查询哪些行。后面Key 表示你用的那个索引:

    比如:

    

SELECT * FROM tbl_nameWHERE key_column = 10;SELECT * FROM tbl_nameWHERE key_column BETWEEN 10 and 20;SELECT * FROM tbl_nameWHERE key_column IN (10,20,30);SELECT * FROM tbl_nameWHERE key_part1 = 10 AND key_part2 IN (10,20,30);

    

   index:这索引连接类型和ALL一样,除了树的索引扫描,分为两种情况: 1.会便利索引树,2.没有索引树,就是ALL 一样。

     All:全表扫描,通常是最差的一种查询。

Trade System 电子商务系统
Trade System 电子商务系统

功能介绍: 首页展示:折扣商品、商品推荐、新品推荐、热卖排行 购 物 车:顾客选货-入车-提单,大大简化交易流程 意见反馈:顾客可以在线提建议或合作联系 后台管理:注册用户、商品管理、订单管理、网站设置、商品分类 其他功能:优化代码执行效率、韩式设计风格 初始管理员/密码:admin/admin

下载

● Extra:包含mysql 解析查询的额外信息。

   Distinct:mysql 查询不同的行,当找到和当前行匹配的时候,就不再搜索了。

   FirstMatch(tbl_name) :The semi-join FirstMatch join shortcutting strategy is used for tbl_name.  

   Full scan on NULL key:查询分析器无法使用当前索引的一个失败策略。

   Impossible HAVING: where 条件总是false,无法筛选任何行

   Impossible WHERE noticed after reading const tables:和上面类似

   LooseScan:利用索引来扫描一个子查询表可以从每个子查询的值群组中选出一个单一的值。

   Not exists:mysql 优化了left join 的查询,

   比如:

   

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;假设t2.id 定义为 not null,这种情况下,Mysql 扫描t1 并且用t1.id 在t2中查找行,如果Mysql 在t2中找到匹配的行,它表明t2.id 不可能为null,因此不会扫描剩下的具有相同id的行,换句话说,t1 中的每一行,mysql 每次都在t2中做一下查询,无论t2 有多少匹配。

   

    Using filesort:无法利用索引完成的排序,比如文件排序

    Using index:利用索引树扫描得出结果,不用全部扫描

    Using temporary:利用临时表存储结果集,通常查询包含 GROUP BY and ORDER BY 。

     Using where:使用where 限定那些行于下一张表匹配,或者返回到客户端,除非你想要获取or 检查表中所有行,如果extra 的值不是Using where并且连接类型不是all 或者index ,那么你可能有一些错误在你的查询中。

    Using join buffer:

    Using MRR:有点复杂,

    参考:http://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html

    和:http://blog.csdn.net/zbszhangbosen/article/details/7463394

● Key:key 这一列表明实际你用的是那一个索引,没有则是null

● Key len:该列是Mysql 使用key 的长度,没有则为null,文档提示这值能确定你 multiple-part key  中使用的是哪一部分。

● Rows:表示Mysql 执行语句扫描的行数

● Possible_keys:表示mysql 找到的这些行数据,在indexes(很多索引)里面的哪一个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

小结:

        1.这个不得不吐槽,翻译太烂了...以至于后面都是自己的理解弄的,建议都去看原文啊,而且5.6+ 变化挺多,有些变化我也没遇到过,请见谅啊。

        2.这些简单的说明呢,仅仅是给大家提供一种分析SQL 的途径,也提醒大家不要盲目的根据SQL 去判断效率,当然你经验丰富,就不说啦~。~新手学习。

        3.如果你需要更详细的可以用show profile 的东西,能看到更详细的信息,精确度也更高,还有关于一些实战方面的应用,没来得及总结,这个以后再介绍吧。

        4.还是请见谅下,不正确的 狗血的地方请指出哦,谢谢啦。

        最后分享个不错的mysql 地址:

        http://www.mysqlab.net/

        http://www.mysqlpub.com/

    

      

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

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

精品课程

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

共48课时 | 9.3万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

Excel 教程
Excel 教程

共162课时 | 17.8万人学习

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

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