数据库(6)Mysql中explain分析SQL语句执行效率_CringKong的博客-CSDN博客_数据库 explain sql


本站和网页 https://blog.csdn.net/cringkong/article/details/80903858 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

数据库(6)Mysql中explain分析SQL语句执行效率_CringKong的博客-CSDN博客_数据库 explain sql
数据库(6)Mysql中explain分析SQL语句执行效率
CringKong
于 2018-07-03 20:20:13 发布
4354
收藏
14
分类专栏:
数据库
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cringkong/article/details/80903858
版权
数据库
专栏收录该内容
9 篇文章
0 订阅
订阅专栏
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。
写下这篇博文之前,我学习了大量的关于数据库索引的基础知识,所以如果想更好的理解explain的用法,请先耐心学习 ——数据库索引。
一. 什么是explain?二 . 关键字分析:
2.1 id2.2 select_type2.3 table2.4 type(重点理解)
2.4.1 ALL:2.4.2 index:2.4.3 range:2.4.4 ref 和 eq_ref:2.4.5 const 和 system:2.4.6 NULL一些有趣的现象 2.5 possible_keys,key2.6 ref ,rows2.7 Extra(重点了解)
一. 什么是explain?
explain是Mysql的一个关键字,用来分析某条SQL语句执行过程和执行效率。
explain又叫执行计划,主要是用来查看优化器将决定如何执行查询过程,比如究竟是全表扫描还是索查询,还可以看到那种访问策略是优化器使用的,比如究竟是直接访问索引内容,还是又进行了筛选过滤,亦或者回查聚合索引等等/
我们先看看一下,通过explain关键字可以获得什么信息:
可以看到信息有如上图几点:
id:执行编号,表示SELECT所属的行。如果SQL语句中没有子查询或者关联查询,那么id只有唯一的1,如果有子查询和关联查询,那么就会有多个id。select_type:标志本行是简单查询还是其他复杂查询table:标识本行查询是访问了哪个表type:标识本行查询优化器会使用什么方式进行查询,这个很重要,是我们进行分析的重点内容。possible_key:标识本行查询可以使用到的全部索引key:标识本次查询真实使用的索引,这个也很重要key_len:标识本次查询使用索引的长度,单位是字节数ref:标识使用索引查询时,使用了那种数据值进行选择,可以是常量,也可以是其余表的字段值row:显示本次查询会有多少行结果被影响Extra:一些额外信息,但也很重要
二 . 关键字分析:
2.1 id
可以看到有多子句查询的时候,id会有多个,执行顺序是从大到小,也就是说id为2的子句先执行,然后是id为1的语句执行。
而对于连接查询,虽然有两次查询过程,但是id都是1,因为他们是并列关系不是嵌套关系,id相等的情况下执行顺序自上至下。
2.2 select_type
常见的分为如下几种:
SIMPLE:简单查询,不包括子句和联合查询(union)PRIMARY:包含子查询或者联合查询,最外层标识为PRIMARYSUBQUERY:这个很容易理解了,就是子查询内层的子句,被标识为SUBQUERYDERIVED:派生表,子查询中派生出来的临时表,位于FROM的子查询中UNION:位于UNION中联合查询关键字后面的子句,被标记为UNION,但是如果在FROM中还是标识为DERIVED
其余都不会很常见,而且只要弄清楚意思就可以了,因为我们直接看SQL语句也是能看出来各个结构,因此这项并不是很重要。
2.3 table
这个就是显示从哪个表进行了本行查询。
还是看这张图,很清晰的显示了两次查询的是哪个表内容。
2.4 type(重点理解)
我们在这里建立了一个test表:
表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:
ALL, index, range, ref, eq_ref, const, system, NULL
从左到右,查询性能从最差到最好。至于什么时候会出现这些情况以及为什么出现这些情况,我们看逐一进行分析。
2.4.1 ALL:
全表扫描,不使用索引,在硬盘上一条一条的进行扫描。
可以看出,没有WERHE查询子句的情况下会使用全表扫描。同时如果WHERE子句中查询了没有建立索引的字段,也会进行全表查询。
这很容易理解,因为wu这个字段没有在任何索引中,所以要mysql安照它进行查询,那么msyql必须要一条一条的遍历表中的行,然后找出符合条件的行进行查询。
2.4.2 index:
index代表使用索引查询,但是遍历整个索引,和全表遍历的差别差不多,只不过读取的数据更少,效率稍微高一些。 我们查询建立索引的字段san,可以看到使用了index_1作为索引,但是进行的是全索引的遍历。
2.4.3 range:
range代表使用了B-TREE索引进行了范围查询,利用了B-TREE的查询性质,查询效率比起前两种有了很大的提升。 显而易见的索引范围扫描是带有between或者where子句里带有LIKE,<, >查询。当mysql使用索引去查找一系列值时,例如IN()和OR列表,也会显示range(范围扫描),当然性能上面是有差异的。
2.4.4 ref 和 eq_ref:
使用非唯一索引进行查询某个值时是ref,很显然ref也是使用了索引查找的,而且看后面ref字段的值是const,其实和const区别不大。
这种查询的效率高于range,因为首先它同样使用了B-TREE索引的性质查询,其次就是它返回的数据较少。
eq_ref和ref效率差不多,只不过eq_ref是在使用唯一索引进行查询时使用到,因此最多返回一条数据。
简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
2.4.5 const 和 system:
使用常量进行索引查询。system是const类型的特例,当查询的表只有一行的情况下,使用system
我个人认为这种查询效率,和ref的值为const的查询应该相差无几。
2.4.6 NULL
MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
一些有趣的现象
在之前索引的学习中,我们就知道聚合索引的值会存储在非聚合索引中,下面我们验证一下。
id是表的主键,也就是Mysql默认的聚合索引的字段,首先对于index_1,其中的字段只有san,但是我们发现如果查询id字段,这次查询还是直接Using index(索引覆盖),索引覆盖的意思就是索引中包含你想查询的字段,这就证实了非聚合索引(index_1)中确实包含聚合索引(主键索引)的字段id。
还有就是最左前缀原则这个我提到过无数次的东西。
很明显的说明了,符合最左前缀原则的查询,就可以直接使用建立的组合索引index_2(san,si)进行利用B-TREE索引的 查询
这个emmm,自行体会不符合最左前缀原则的查询,使用了index_2进行了全索引扫描,然后再一步进行WHERE条件筛选。
2.5 possible_keys,key
这个上面已经说的很清楚了,possible_keys是可以使用的索引,而key是实际要使用的索引。
上图看到,这次查询可以使用index_1(san),或者index_2(san,si),但mysql优化器最终选择了index_1(san),因为更高效开销更小。
2.6 ref ,rows
上面也说的很清楚了,不再这多说。
2.7 Extra(重点了解)
这里我说几种比较常见的:
a. Using index 该值表示相应的select操作中使用了覆盖索引(Covering Index) 上面我也体到这个概念了,这个很容易理解就是直接从索引中就获得了想要的东西,没有必要进行二次查询。 可以看出,这次查询就是索引覆盖索引的一次查询,因为id 是聚合索引的值,存在非聚集索引idnex_1中。
因为wu字段没有在索引覆盖中,所以需要二次查询。
b. Using where 这个有很多网上博客说的都不太清楚,其实很容易理解,Using where是指通过数据库引擎第一次查询以后,得到一个结果集,但是这个结果集不满足WHERE语句的限制,所以会Mysql会对这个结果集进行一次筛选,最后得到符合限制的数据集。
可以根据这句SQL语句进行理解,因为san,si是索引index_2的内容,所以index_2是覆盖索引(Using index)很容易理解,但是查询条件是si='y',这时Mysql采取的手段是,遍历全索引(type:index),然后根据si='y'这个WHERE语句中的条件进行一次筛选。这就是Using where的含义
c. Using temporary 用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
d. Using index condition 这个意思是mysql会根据索引查找到的内容,作为条件进行下一次的查询操作,可以是排序查询等等操作。
根据索引的内容,进行了顺序展示操作,因为id是局聚集索引,存储顺序就是索引顺序,因此不需要排序。
e. Using filesort
MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。
CringKong
关注
关注
点赞
14
收藏
打赏
评论
数据库(6)Mysql中explain分析SQL语句执行效率
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。写下这篇博文之前,我学习了大量的关于数据库索引的基础知识,所以如果想更好的理解explain的用法,请先耐心学习 ——数据库索引。一. 什么是explain?二 . 关键字分析:2.1 id2.2 select_type2.3 table2.4 type(重点理解)2.4.1 ALL:2.4...
复制链接
扫一扫
专栏目录
SQL数据库
qq_40961821的博客
05-03
1万+
SQL简介
SQL 数据库基本操作
程序员小白的博客
03-06
1万+
SQL 数据库基本操作
评论 2
您还未登录,请先
登录
后发表或查看评论
25条提高SQL运行效率的方式
最新发布
qq_59068750的博客
11-13
293
25条提高SQL运行效率的方式!!!(索引占大部分)
SQL语句的基础教程(一)
weixin_44561769的博客
06-18
2万+
SQL语句的基础教程(一)
开发工具与关键技术:SQL Server 2014 Management Studio、SQL语句的基础教程(一)
作者:袁何恩
撰写时间:2019年6月16日
今天,我要和大家分享的技术是SQL语句的基础教程。
SQL可以面向数据库执行查询数据,在数据库中取回、插入、更新、删除数据和创建新表,并且建新数据库,SQL语句可以分为两个部分,分别是数据操作语言和数据定义语言...
SQL 数据库基础知识
liushuirujin的博客
04-17
7287
无论是自学python,还是学校授课SQL,都要认真,大学不是用来颓废自己的
MySQL进阶:sql性能分析
wang5701071的博客
04-02
7363
1:sql的执行次数分析:
sql: show global status like 'com_______'
解释:通过该命令可以查看当前数据库下的增删改查的使用次数,来采取对应的优化处理. value值就是执行的次数.
2:慢查询日志
sql: show variables like '%slow_query_log%';
慢查询日志会记录超出自己设置的时间还没有执行完毕的sql. 默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优...
SQL零基础入门必知必会!
华章IT官方博客
10-07
6677
???? 前言SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言...
MySQL----SQL性能分析
记笔记是另一种学习过程
04-24
499
文章目录SQL性能分析1 SQL执行频率2 慢查询日志2.1 查询慢日志是否开启2.2 查询慢日志的时间2.3 查看慢日志文件中记录的信息3 profile详情3.1 查询是否支持 profile3.2 查询 profile 是否开启3.3 开启 profile3.4 查看每一条SQL的耗时基本情况3.5 查看指定query_id的SQL语句各个阶段的耗时情况3.6 查看指定query_id的SQL语句CPU的使用情况4 explain4.1 语法4.2 Explain 执行计划中各个字段的含义
SQL性
数据库SQL入门,这一篇就够了(全文内容两万字)
编程小鹏的博客
03-01
4142
数据库入门基础-SQL教程
MySQL:SQL性能分析
知识改变命运,ヾ(◍∇◍)ノ゙【求关注】
03-27
582
Sql性能分析详解
SQL Server 数据库学习
热门推荐
灰太狼的小秘密
08-31
14万+
一、认识数据库
1、数据库的基本概念
2、数据库常用对象
3、数据库的组成
数据库主要由文件和文件组组成。数据库中所有的数据和对象都被存储在文件中。
二、创建数据库
1、创建数据库
对象资源管理器—数据库——右击——新建数据库
三、操作数据表与视图
1、创建数据表
空值:表示数据未知。非空值:数据列不允许空值。
(1)选择一个数据库——展开 表——...
史上最全SQL基础知识总结(理论+举例)
PILIpilipala的博客
02-13
3万+
SQL基础知识一、SQL 概述1、什么是 SQL2、语法要求二、SQL 分类三、DDL(Data Definition Language):数据定义语言基本操作1.操作数据库2.数据类型3.操作表四、DML(Data Manipulation Language):数据操作语言1.插入数据2.修改数据3.删除数据五、DCL(Data Control Language):数据控制语言1.创建用户2.给用户授权3.撤销授权4.查看用户权限5.删除用户6.修改用户密码(以root身份)六、DQL(Data Quer
mysql提高运行效率_提升Mysql执行效率的SQL优化技巧汇总
weixin_29666489的博客
01-19
521
在介绍具体的 SQL 调优的方法前,我们先来简单了解下 MySQL 调优金字塔理论。如上图所示,数据库优化维度有四个:硬件、系统配置、数据库表结构、SQL 及索引。优化成本:硬件&gtl;系统配置>数据库表结构>SQL及索引优化效果:硬件我们可以看出数据库 SQL 语句效率调优是最省成本效果最好的办法,也就是结构设计上的优化。本文我们就来谈谈 MySQL 中常用的 SQL 优化...
数据库---SQL
m0_58342797的博客
03-21
1677
基本概念
数据库(Database)
简称DB,是长期存储在计算机内,有组织的,可共享的大量数据的集合。
基本特征
我们安装数据库软件时,安装的是客户端和服务端,在客户端上输入指令,服务器会进行操作。
...
MYSQL 复杂查询,及效率分析
ppxin的专栏
09-14
413
目录
一、子查询(或嵌套查询)
1、where子查询(进行条件筛选)
(1) IN子查询
(2)比较运算符子查询
(3)EXIST子查询
(4)where子查询的示例
2、select子查询(创建新字段域) --- 显示customers 表中每个客户的订单总数
3、from子查询(对结果再查询)
4、复杂子查询实例 --- 查询信用卡PA类型交易记录的交易额
二、连接查询(或...
数据库(SQL)
m0_52329101的博客
07-13
3687
文章目录数据库的基本概念MySQL数据库软件
学习的内容:
1.数据库的基本概念
2.MySQL数据库软件
1.安装
2.卸载
3.配置
3.SQL
数据库的基本概念
1.数据库的英文单词:DataBase 简称:DB
2.什么是数据库?
用于存储和管理数据的长仓库。
3.数据库的特点:
&nb
数据库--SqlServer详解
李宥的博客
11-08
1万+
数据库–SQLServer详解
零、文章目录
一、数据库概念
1、数据库基本概念
(1)数据库(DataBase:DB)
数据库是是按照数据结构来组织、存储和管理数据的仓库。---->存储和管理数据的仓库
(2)数据库管理系统(Database Management System:DBMS)
是专门用于管理数据库的计算机系统软件。数据库管理系统能够为数据库提供数据的定义、建立、维护、查询和统计等操作功能,并完成对数据完整性、安全性进行控制的功能。
注意:我们一般说的数据库,就是指的DBMS
2、数据库
mysql查看SQL语句执行效率
无名程序员
02-28
969
mysql查看SQL语句执行效率
主要用Explain命令去查看
语法 : explain select … from … [where ...]
例如:EXPLAIN select * from city
结果如下:
id
select_type
table
type
possible_keys
key
key_len
ref
rows
...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:代码科技
设计师:Amelia_0503
返回首页
CringKong
CSDN认证博客专家
CSDN认证企业博客
码龄5年
京东商城
65
原创
3万+
周排名
2万+
总排名
19万+
访问
等级
2149
积分
126
粉丝
223
获赞
69
评论
628
收藏
私信
关注
热门文章
IDEA中Maven配置问题全解决
46153
Java线程和操作系统线程的关系
26278
JAVA--Socket编程实现HTTP报文收发(模拟浏览器)
15525
JavaNIO和零拷贝(Zero Copy)
12437
Java获取图片文件格式(后缀)
12102
分类专栏
Java基础
8篇
jvm原理
13篇
设计模式
2篇
数据结构
4篇
maven基础
3篇
git教程
5篇
计算机基础
9篇
socket编程
7篇
java多线程
13篇
数据库
9篇
杂谈
2篇
中间件使用
5篇
最新评论
一次OpenJDK Bug导致线上问题的排查实践
水月轨迹:
兄弟,京东ME找不到你了
一次OpenJDK Bug导致线上问题的排查实践
北小浪:
大佬真厉害
Log4j2异步日志不打印问题
假如我有一口缸:
牛,一针见血,果然是没引入disruptor依赖
JavaNIO--1.JavaI/O模型
cocosparrow:
B哥牛啊
HashMap扩容流程
菜菜的大数据开发之路:
博主,我们互粉吧,大家一起加油,一起努力进步呀?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
一次OpenJDK Bug导致线上问题的排查实践
入侵JVM?Java Agent原理浅析和实践(下)
入侵JVM?Java Agent原理浅析和实践(中)
2022年1篇
2021年5篇
2020年2篇
2019年15篇
2018年42篇
目录
目录
分类专栏
Java基础
8篇
jvm原理
13篇
设计模式
2篇
数据结构
4篇
maven基础
3篇
git教程
5篇
计算机基础
9篇
socket编程
7篇
java多线程
13篇
数据库
9篇
杂谈
2篇
中间件使用
5篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
CringKong
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值