explain 能分析你写的sql性能高不高,就这样概括下,不服来拍砖!!!
执行计划包含的信息
为什么说他能分析,因为他能干这种事情
1.表的读取顺序
2.数据读取操作的操作类型
3.哪些索引可能被使用
4.哪些索引被实际使用
5.表之间的引用
6.每张表有多少行被优化器查询
id select查询的序列号,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id相同不同,同时存在
select_type主要用于区别联合查询、子查询等的复杂查询,值有这些,下面分别介绍
SIMPLE 很简单的查询
PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为
SUBQUERY 在select或where列表中包含了子查询
DERIVED 在from列表中包含的子查询被标记为DERIVED(衍生)
mysql会递归执行这些子查询,把结果放在临时表里
UNION 若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层 select将被标记为DERIVED
UNION RESULT 从UNION表获取结果的select
table 显示这一行的数据是关于哪张表的
type是显示访问类型,较为重要的一个指标
显示查询使用了何种类型,从好到差依次是
system > const > eq_ref > ref > range > index > all
以上列出的只是常用的,知道这些就够了
保证查询达到range级别就够了,最好达到ref
说明:
system:表只有一行记录(等于系统表) 这是const类型的特例,可以忽略不计
const:表示通过索引一次就找了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以 很快。如将主键置于where列表中,就能将该查询转换为一个常量
eq_ref:唯一性索引扫描,毒药每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,可能会找到多个符合条件的行,他属于查找和扫描 的混合体(例如查找哪些员工在研发部)
range:只检索给定范围的行,场景说明:where语句中出现between、< 、>、in等的查询
这种范围扫描索引扫描比全表扫描要好,开始于索引的某一点,结束另一点,不用扫描全部索引
index:Full Index Scan,index与all区别为index类型只遍历索引树,通常比all快,因为索引文件通常比数据 文件小。索然all和index都是读全表,但index是从索引中读取的,all是从硬盘中读的
all:Full Table Scan,遍历全表以找到匹配的行
possible_keys说明:
显示可能应用在这张表中的索引,一个或多个。但不一定被查询实际使用
key说明:
实际使用的索引,如果没有使用就是NULL
key_len说明:
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
key_len的长度计算公式:
varchr(10)变长字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)
varchr(10)变长字段且不允许NULL = 10 *( character set:utf8=3,gbk=2,latin1=1)+2(变长字段)
char(10)固定字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)
char(10)固定字段且不允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)
如果还不明白可以借鉴此博客地址:http://www.cnblogs.com/gomysql/p/4004244.html
ref说明:
显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值
(列出的是通过常量const,或是某个表的某个字段来过滤的。)
rows说明:
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
Extra说明:查询中每一步实现的额外细节信息,主要可能会是以下内容:
1). Distinct:查找distinct值,所以当mysql找到了第一条匹配的结果后,将停止该值的查询而转为后面其他值的查询; FullscanonNULLkey:子查
询中的一种优化方式,主要在遇到无法通过索引访问null值的使用使用;
2). ImpossibleWHEREnoticedafterreadingconsttables:MySQLQueryOptimizer通过收集到的统计信息判断出不可能存在结果;
3). Notables:Query语句中使用FROMDUAL或者不包含任何FROM子句;
4). Notexists:在某些左连接中MySQLQueryOptimizer所通过改变原有Query的组成而使用的优化方法,可以部分减少数据访问次数;
5). Rangecheckedforeachrecord(indexmap:N):通过MySQL官方手册的描述,当MySQLQueryOptimizer没有发现好的可以使用的索引的时候,如果发现如果来自前面的表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL检查是否可以使用range或index_merge访问方法来索取行。
6). Selecttablesoptimized away:当我们使用某些聚合函数来访问存在索引的某个字段的时候,MySQLQueryOptimizer会通过索引而直接一次定位到所需的数据行完成整个查询。当然,前提是在Query中不能有GROUPBY操作。如使用MIN()或者MAX()的时候;
7). Usingfilesort:当我们的Query中包含ORDERBY操作,而且无法利用索引完成排序操作的时候,MySQLQueryOptimizer不得不选择相应的排序算法来实现。坏
8). Usingindex:所需要的数据只需要在Index即可全部获得而不需要再到表中取数据;好
9). Usingindexforgroup-by:数据访问和Usingindex一样,所需数据只需要读取索引即可,而当Query中使用了GROUPBY或者DISTINCT子句的时候,
如果分组字段也在索引中,Extra中的信息就会是Usingindexforgroup-by;
10). Usingtemporary:当MySQL在某些操作中必须使用临时表的时候,在Extra信息中就会出现Usingtemporary。主要常见于GROUPBY和ORDERBY等操作中。 坏
11). Usingwhere:如果我们不是读取表的所有数据,或者不是仅仅通过索引就可以获取所有需要的数据,则会出现Usingwhere信息;
12). Usingwherewithpushedcondition:这是一个仅仅在NDBCluster存储引擎中才会出现的信息,而且还需要通过打开ConditionPushdown优化功能才可能会被使用。控制参数为engine_condition_pushdown。
相关推荐
在深入探讨mysql中explain语句的使用和解释之前,有必要先介绍mysql的存储引擎,因为不同的存储引擎对于数据库性能有着直接的影响。 存储引擎是mysql中用于存储、检索和索引数据的组件。不同的存储引擎具有各自的...
《PyPI官网下载 | django-explain-1.1.tar.gz:深入理解Django数据库查询解释器》 在Python的世界里,Django是一个广泛使用的开源Web框架,它以其“快速开发”和“清晰的设计”理念而备受赞誉。Django-explain是...
MySQL Explain 详解 MySQL Explain 是 MySQL 中的一个重要工具,用于解释和优化 SQL 查询语句。通过 Explain,可以了解 MySQL 是如何执行查询语句的,并且可以根据 Explain 的结果来优化查询语句。 一、用法 ...
### 从Mysql-EXPLAIN探寻数据库查询优化 在数据库管理与优化领域,MySQL的`EXPLAIN`命令是一项非常强大的工具,它可以帮助我们深入了解MySQL如何执行SQL查询,并据此进行优化,提高查询性能。本文将围绕MySQL中的`...
tf-explain将可解释性方法实现为Tensorflow 2.x回调,以简化神经网络的理解。 参见 文档: : 安装 tf-explain可作为Alpha版本在PyPi上使用。 要安装它: virtualenv venv -p python3.6 pip install tf-explain ...
MySQL 8.0.22 是 MySQL 数据库管理系统的一个重要版本,专为 Linux 操作系统设计。这个压缩包“mysql8.0.22-linux-x86_64.tar.zip”包含了在 Linux 上安装和运行 MySQL 8.0.22 所需的所有文件和组件。以下是关于 ...
例如,使用EXPLAIN分析查询计划,优化JOIN操作,合理使用索引等。 8. **最新版本与社区支持**: - 虽然提供的版本较旧,但MySQL不断更新,最新的版本(如8.x)引入了更多新特性,如窗口函数、JSON支持等。同时,...
Mysql Explain 使用
MySQL explain-MySQL执行计划解读.ppt
LNH_MySQL 22-利用explain查看sql语句的执行计划.mp4
MySQL是世界上最受欢迎的开源数据库系统之一,特别是在Web应用程序中。MySQL 5.5.18是该系列的一个重要版本,提供了许多性能优化和新特性。本文将深入探讨MySQL 5.5.18在Windows 32位环境下的安装过程,并提供相关...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,尤其在Web应用程序中被广泛使用。这个压缩包文件"mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz"包含了MySQL服务器的5.7.17版本,专为运行在Linux系统上(基于...
Grad-CAM-for-AlexNet-to-explain-the-reason-of-classification-main
### MySQL 5.7 优化指南 #### 一、优化概览 在MySQL 5.7版本中,优化章节提供了全面而深入的指导,旨在帮助数据库管理员和开发人员提高数据库性能。这部分内容从整体上概述了优化的重要性和基本概念。 #### 二、...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其最新版本为8.0.26,专为macOS 11(x86, 64-bit)系统设计的DMG档案名为“mysql-8.0.26-macos11-x86_64.dmg”。这个版本的MySQL为苹果操作系统提供了强大的...
MySQL是世界上最受欢迎的开源数据库系统之一,主要用于存储、管理和检索数据。"mysql-essential-5.1.45-win32" 是一个针对Windows 32位系统的MySQL基础版安装包,版本号为5.1.45。这个版本包含了运行MySQL服务器、...
MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛使用。这个"mysql-essential-5.0.27-win32.rar"压缩包包含的是MySQL 5.0.27版本的Windows 32位安装程序,这是一个关键的历史...
MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,由Oracle公司开发和维护。社区版是MySQL的一个分支,它是免费且开源的,允许个人和组织自由使用、修改和分发。MySQL 5.6.10.1是该系列中的一个特定版本...
4. 查询优化:MySQL的Query Optimizer负责选择最优的执行路径,包括通过EXPLAIN命令可以看到的执行计划。源码中包含了解析统计信息、生成执行树、考虑索引选择等过程。 5. 锁机制:MySQL中的锁机制包括表级锁、行级...