MySQL优化之explain

在日常的MYSQL优化中我们常常看到这样一个关键词:explain,例如这种:

EXPLAIN SELECT * FROM Cloud_Order WHERE money < 10;

explain是什么呢?使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。通过explain命令可以得到:

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引可以使用
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询

首先让我们来看看使用EXPLAIN输入的结果

结果显示输出了结果一堆字段和对应的值,但是这些字段是什么意思?对应的值又是什么呢?如何通过这些字段来分析到SQL的性能并做出优化呢?别急,下面我们就一起来一一分析。

EXPLANIN字段分析


id : SELECT识别符。这是SELECT的查询序列号select_type:SELECT类型,可以为以下任何一种·SIMPLE:简单SELECT(不使用UNION或子查询)·PRIMARY:最外面的SELECT·UNION:UNION中的第二个或后面的SELECT语句·DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询·UNION RESULT:UNION 的结果·SUBQUERY:子查询中的第一个SELECT·DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询·DERIVED:导出表的SELECT(FROM子句的子查询)table:显示这一行的数据是关于哪张表的type:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL。下面给出各种类型,按照从最佳类型到最坏类型进行排序:·system、const:可以将查询的变量转为常量. 如id=1; id为 主键或唯一键.·eq_ref:访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键)·ref:访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生·range:这个连接类型使用索引返回一个范围中的行,比如使用<或>查找东西,并且该字段上建有索引时发生的情况(注:不一定好于index)·index:以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描·ALL:全表扫描,应该尽量避免possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key:实际使用的索引。如果为NULL,则没有使用索引。MYSQL很少会选择优化不足的索引,此时可以在SELECT语句中使用USE INDEX(index)来强制使用一个索引或者用IGNORE INDEX(index)来强制忽略索引key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好ref:显示索引的哪一列被使用了,如果可能的话,是一个常数rows:MySQL认为必须检索的用来返回请求数据的行数filtered:显示了通过条件过滤出的行数的百分比估计值。Extra:关于MYSQL如何解析查询的额外信息,主要有以下几种·Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。·range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。·Using index:只用到索引,可以避免访问表. ·Using tmporary:用到临时表·Using where:使用到where来过虑数据. 不是所有的where clause都要显示using where. 如以=方式访问索引.·Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

explain实践

说了这么多,实践才能出真知。下面我们通过一个简单的例子来优化我们一些不堪的SQL。

首先我们还是一张数据表举例。表结构如下。

这是一张典型的订单表,其他字段我们可以省略不看,我们可以只看一个money字段,这基本是订单表都会用到的字段。由于时间关系,事先我已经为这个表准备了一堆模拟数据。

从上图可以看出,表中已经有一万条数据,下面我们来写一个根据money条件来查询订单的SQL。

只能说上图的结果不尽人意。让我们回到之前explain字段的分析,其中type字段的值是ALL,按照分析来说,这个表用了全表搜索,我们应尽量避免!!!再看rows字段,值是16242,天啊!!所有记录都去请求了,那慢是有原因的。

好了,通过上面的数据分析,我们可以去想一下,money字段是否能加上索引来提升查询速度呢?因为上述结果中好像是没用到索引的。话不多说,我们来为money字段加上索引

加上索引之后,我们再用刚刚的EXPLAIN语句执行一下,见证奇迹的时候到了!

经过加上索引之后,相同的sql语句,得出的结果完全不一样,type字段变成了range,我们也看到key显示了money,证明了索引值被用上了。更重要的是rows字段变成了785,跟原来相比少了不知道多少,可想而知性能有了多大的提高!

好了,上面就是explain的简单实践。

总结

通过explain,我们可以对原有的sql做进行不同的分析,可以分析出有没有使用到索引,可以知道这是一条快SQL还是慢SQL,EXPLAIN的作用就是帮我们显示出SQL的性能瓶颈和各项可能的结果,这对于我们去优化MSQL的查询有着重要的意义,根绝EXPALIN字段返回不同的结果,我们就能对原有的慢SQL进行改造了。

原文地址:https://www.cnblogs.com/tqtz777/p/11628958.html

时间: 2024-10-06 14:11:12

MySQL优化之explain的相关文章

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

MySQL优化—工欲善其事,必先利其器之EXPLAIN

转自:http://www.cnblogs.com/magialmoon/archive/2013/11/23/3439042.html mysql官方手册关于explain命名的说明文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type 最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下

【MySQL笔记】SQL优化利器 - explain命令的输出格式详解

有MySQL使用经验的同学在实际项目中可能会遇到SQL慢查询的场景,有些场景很容易定位问题所在(如单表操作有慢查询SQL时,仔细check SQL语句通常很容易定位索引问题),而有些复杂业务场景下(如多表联合查询几十个字段并做group或sort等操作),人工check SQL语句通常很难发现SQL瓶颈根源.这个时候,MySQL提供的explain命令就派上用场了. 本笔记主要对explain的输出结果做说明,并给出根据explain输出对SQL做优化的思路. 1. EXPLAIN语法及用途 e

mysql优化(三)–explain分析sql语句执行效率

mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select … from … [where …] 例如:explain select * from

mysql优化命令:explain

原文地址:http://www.cnblogs.com/magialmoon/p/3439042.html#id 在园子里偶然看到这篇文章,感觉十分不错,全面,思路清晰,因为自己也一直想做一些常用命令的总结,就先拿过来用了,感谢原作者! 1.测试环境 2.explain介绍 2.1 id 2.2 select_type 2.3 table 2.4 type 2.5 possible_keys 2.6 key 2.7 key_len 2.8 ref 2.9 rows 2.10 Extra 3.总结

mysql优化学习备忘之 explain

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.in

MySQL索引及Explain及常见优化

MySQL索引设计的原则 1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出现在WHERE 子句中的列,或连接子句中指定的列,而不是出现在SELECT 关键字后的选择列表中的列. 2. 使用惟一索引.考虑某列中值的分布.对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差.例如,存放年龄的列具有不同值,很容易区分各行.而用来记录性别的列,只含有" M"和"F",则对此列进行索引没有多大用处(不管搜索哪个值,都会得出大约一半的行)

mysql优化实战(explain &amp;&amp; 索引)

实验环境: 1.sql工具:Navicat 2.sql数据库,使用openstack数据库作为示例 一.mysql索引查询 show index from instances 结果字段解释: Table:数据库表名 Non_unique:索引不能包括重复词,则为0.可以,则为1. Key_name:索引的名称. 索引中的列序列号,从1开始. 列名称 列以什么方式存储在索引中.在MySQL中,有值'A'(升序)或NULL(无分类). 索引中唯一值的数目的估计值.通过运行ANALYZE TABLE或

mysql优化--explain分析sql语句执行效率

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如:explain select * from news; 输出:+----+-------------+-------+-------+-------------------+---------+-