MySQL查询优化工具explain介绍


下文主要给大家带来MySQL查询优化工具explain,希望这些内容能够带给大家实际用处,这也是我编辑这篇文章的主要目的。好了,废话不多说,大家直接看下文MySQL查询优化工具explain吧。在日常的MYSQL优化中我们常常看到这样一个关键词:explain,例如这种:EXPLAIN SELECT * FROM Cloud_Order WHERE money > 10; explain是什么呢?使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。通过explain命令可以得到:表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询
首先让我们来看看使用EXPLAIN输入的结果
结果显示输出了结果一堆字段和对应的值,但是这些字段是什么意思?对应的值又是什么呢?如何通过这些字段来分析到SQL的性能并做出优化呢?别急,下面我们就一起来一一分析。id : SELECT识别符。这是SELECT的查询序列号
select_typeSELECT类型,可以为以下任何一种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:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为systemconsteq_regrefrangeindexALL。下面给出各种类型,按照从最佳类型到最坏类型进行排序:
systemconst:可以将查询的变量转为常量. id=1; id 主键或唯一键.
eq_ref:访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键)
ref:访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生
range:这个连接类型使用索引返回一个范围中的行,比如使用>或index)
index:以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描
ALL:全表扫描,应该尽量避免

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
ke开发云主机域名y:实际使用的索引。如果为NULL,则没有使用索引。MYSQL很少会选择优化不足的索引,此时可以在SELECT语句中使用USE INDEXindex)来强制使用一个索引或者用IGNORE INDEXindex)来强制忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rowsMySQL认为必须检索的用来返回请求数据的行数
filtered:显示了通过条件过滤出的行数的百分比估计值。
Extra:关于MYSQL如何解析查询的额外信息,主要有以下几种
DistinctMySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using index:只用到索引,可以避免访问表.
Using tmporary:用到临时表
Using where:使用到where来过虑数据. 不是所有的where clause都要显示using where. 如以=方式访问索引.
Using filesortMySQL需要额外的一次传递,以找出如何按排序顺序检索行。 说了这么多,实践才能出真知。下面我们通过一个简单的例子来优化我们一些不堪的SQL。
首先我们还是一张数据表举例。表结构如下。
这是一张典型的订单表,其他字段我们可以省略不看,我们可以只看一个money字段,这基本是订单表都会用到的字段。由于时间关系,事先我已经为这个表准备了一堆模拟数据。
从上图可以看出,表中已经有一万条数据,下面我们来写一个根据money条件来查询订单的SQL。 只能说上图的结果不尽人意。让我们回到之前explain字段的分析,其中type字段的值是ALL,按照分析来说,这个表用了全表搜索,我们应尽量避免!!!再看rows字段,值是16242,天啊!!所有记录都去请求了,那慢是有原因的。 好了,通过上面的数据分析,我们可以去想一下,money字段是否能加上索引来提升查询速度呢?因为上述结果中好像是没用到索引的。话不多说,我们来为money字段加上索引加上索引之后,我们再用刚刚的EXPLAIN语句执行一下,见证奇迹的时候到了! 经过加上索引之后,相同的sql语句,得出的结果完全不一样,type字段变成了range,我们也看到key显示了money,证明了索引值被用上了。更重要的是rows字段变成了785,跟原来相比少了不知道多少,可想而知性能有了多大的提高!对于以上关于MySQL查询优化工具explain介绍,大家是不是觉得非常有帮助。如果需要了解更多内容,请继续关注我们的行业资讯,相信你会喜欢上这些内容的。

相关推荐: MySQL 5.7安装部署总结

之前搭建MySQL环境都是使用公司内部使用的脚本,其实说实话屏蔽了很多细节,对MySQL的安装还是了解比较肤浅,今天有个MySQL 5.7的数据迁移的任务,也是为了熟悉安装过程就走了一遍安装的流程,整体和5.6差别不大,这里演示安装的都是Percona发布的二…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/07 18:11
下一篇 06/07 18:11

相关推荐