首页 » Web前端 » phpexplain技巧_MySQL优化之explain

phpexplain技巧_MySQL优化之explain

访客 2024-11-06 0

扫一扫用手机浏览

文章目录 [+]

EXPLAIN SELECT FROM Cloud_Order WHERE money > 10;

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

phpexplain技巧_MySQL优化之explain

表的读取顺序数据读取操作的操作类型哪些索引可以利用哪些索引被实际利用表之间的引用每张表有多少行被优化器查询

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

phpexplain技巧_MySQL优化之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://blog.51cto.com/13475644/2352985

博客作者eflypro小普的原创作品

标签:

相关文章

房山第一探寻历史文化名区的魅力与发展

房山区,位于北京市西南部,历史悠久,文化底蕴深厚。作为北京市的一个重要组成部分,房山区的发展始终与首都的发展紧密相连。房山区积极推...

Web前端 2025-02-18 阅读1 评论0

手机话费开钻代码数字时代的便捷生活

我们的生活越来越离不开手机。手机话费作为手机使用过程中的重要组成部分,其充值方式也在不断创新。手机话费开钻代码应运而生,为用户提供...

Web前端 2025-02-18 阅读1 评论0

探寻专业奥秘如何查询自己专业的代码

计算机科学已成为当今社会不可或缺的一部分。掌握一门专业代码对于个人发展具有重要意义。面对繁杂的学科体系,如何查询自己专业的代码成为...

Web前端 2025-02-18 阅读0 评论0