百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql explain的作用有哪些?
分享文章到:

mysql explain的作用有哪些?

发布时间:09/01 来源:未知 浏览: 关键词:

mysql explain的作用是模拟Mysql优化器是怎样施行SQL查询语句的,从而知道Mysql是怎样处置会员的SQL语句,提高数据检索效力,落低数据库的IO成本。

mysql explain的作用是:

模拟Mysql优化器是怎样施行SQL查询语句的,从而知道Mysql是怎样处置你的SQL语句的。剖析你的查询语句或是表构造的机能瓶颈。

mysql> explain select * from tb_user;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | tb_user | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+

(一)id列:

(1)、id 雷同施行次序由上到下
mysql> explain  
    -> SELECT*FROM tb_order tb1
    -> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id
    -> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id;
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                       | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
|  1 | SIMPLE      | tb1   | ALL    | NULL          | NULL    | NULL    | NULL                      |    1 | NULL  |
|  1 | SIMPLE      | tb2   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_product_id |    1 | NULL  |
|  1 | SIMPLE      | tb3   | eq_ref | PRIMARY       | PRIMARY | 4       | product.tb1.tb_user_id    |    1 | NULL  |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+
(2)、假如是子查询,id序号会自增,id值越大优先级就越高,越先被施行。
mysql> EXPLAIN
    -> select * from tb_product tb1 where tb1.id = (select tb_product_id from  tb_order tb2 where id = tb2.id =1);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | PRIMARY     | tb1   | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL        |
|  2 | SUBQUERY    | tb2   | ALL   | NULL          | NULL    | NULL    | NULL  |    1 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
(3)、id 雷同与不一样,同时存在
mysql> EXPLAIN 
    -> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id;
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL  |    1 | NULL  |
|  1 | PRIMARY     | tb2        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
|  2 | DERIVED     | tb1        | const  | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+----+-------------+------------+--------+---------------+---------+---------+-------+------+-------+
derived2:衍生表   2表示衍生的是id=2的表 tb1

相关学习引荐:mysql视频教程

(二)select_type列:数据读取操纵的操纵类型

  1、SIMPLE:简便的select 查询,SQL中不包括子查询或者UNION。

  2、PRIMARY:查询中包括复杂的子查询部分,最外层查询被标志为PRIMARY

  3、SUBQUERY:在select 或者WHERE 列表中包括了子查询

  4、DERIVED:在FROM列表中包括的子查询会被标志为DERIVED(衍生表),MYSQL会递归施行这些子查询,把结果集放到零时表中。

  5、UNION:假如第二个SELECT 显现在UNION之后,则被标志位UNION;假如UNION包括在FROM子句的子查询中,则外层SELECT 将被标志为DERIVED

  6、UNION RESULT:从UNION表猎取结果的select

(三)table列:该行数据是关于哪张表

(四)type列:拜访类型由好到差system > const > eq_ref > ref > range > index > ALL

1、system:表只要一笔记录(等于系统表),这是const类型的特例,平常业务中不会显现。

2、const:通过索引一次查到数据,该类型主要用于比力primary key 或者unique 索引,由于只匹配一行数据,所以很快;假如将主键置于WHERE语句后面,Mysql就能将该查询转换为一个常量。

3、eq_ref:独一索引扫描,关于每个索引键,表中只要一笔记录与之匹配。常见于主键或者独一索引扫描。

4、ref:非独一索引扫描,返回匹配某个独自值得所有行,本质上是一种索引拜访,它返回所有匹配某个独自值的行,就是说它大概会寻到多条相符前提的数据,所以他是查寻与扫描的混合体。

  详解:这品种型表示mysql会按照特定的算法快速查寻到某个相符前提的索引,而不是会对索引中每一个数据都停止一 一的扫描推断,也就是所谓你平常懂得的使用索引查询会更快的取出数据。而要想实现这种查寻,索引却是有要求的,要实现这种能快速查寻的算法,索引就要知足特定的数据构造。简便说,也就是索引字段的数据必需是有序的,才能实现这品种型的查寻,才能利用到索引。

5、range:只检索给定范畴的行,使用一个索引来选着行。key列显示使用了哪个索引。一样在你的WHERE 语句中显现between 、< 、> 、in 等查询,这种给定范畴扫描比全表扫描要好。由于他只需要开端于索引的某一点,而完毕于另一点,不消扫描全部索引。

6、index:FUll Index Scan 扫描遍历索引树(index:这品种型表示是mysql会对整个该索引停止扫描。要想用到这品种型的索引,对这个索引并无特殊要求,只如果索引,或者某个复合索引的一部分,mysql都大概会采纳index类型的方式扫描。但是呢,缺陷是效力不高,mysql会从索引中的第一个数据一个个的查寻到最后一个数据,直到寻到相符推断前提的某个索引)。

7、ALL:全表扫描 从磁盘中猎取数据 百万级别的数据ALL类型的数据尽量优化。

(五)possible_keys列:显示大概利用在这张表的索引,一个或者多个。查询触及到的字段若存在索引,则该索引将被列出,但不必然被查询实际使用。

(六)keys列:实际使用到的索引。假如为NULL,则没有使用索引。查询中假如使用了覆盖索引,则该索引仅显现在key列表中。覆盖索引:select 后的 字段与我们创立索引的字段个数一致。

(七)ken_len列:表示索引中使用的字节数,可通过该列运算查询中使用的索引长度。在不亏损准确性的状况下,长度越短越好。key_len 显示的值为索引字段的最大大概长度,并非实际使用长度,即key_len是按照表定义运算而得,不是通过表内检索出来的。

(八)ref列:显示索引的哪一列被使用了,假如大概的话,是一个常数。哪些列或常量被用于查寻索引列上的值。

(九)rows列(每张表有多少行被优化器查询):按照表统计信息及索引选用的状况,大致预算寻到所需记载需要读取的行数。

(十)Extra列:扩展属性,但是很重要的信息。

1、 Using filesort(文件排序):mysql没法依照表内既定的索引次序停止读取。
 mysql> explain select order_number from tb_order order by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
说明:order_number是表内的一个独一索引列,但是order by 没有使用该索引列排序,所以mysql使用不得不另起一列停止排序。
2、Using temporary:Mysql使用了暂时表留存中心结果,常见于排序order by 和分组查询 group by。
mysql> explain select order_number from tb_order group by order_money;
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | tb_order | ALL  | NULL          | NULL | NULL    | NULL |    1 | Using temporary; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
3、Using index 表示响应的select 操纵使用了覆盖索引,幸免拜访了表的数据行,效力不错。
假如同时显现Using where ,表白索引被用来施行索引键值的查寻。
假如没有同时显现using where 表白索援用来读取数据而非施行查寻动作。
mysql> explain select order_number from tb_order group by order_number;
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
| id | select_type | table    | type  | possible_keys      | key                | key_len | ref  | rows | Extra       |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
|  1 | SIMPLE      | tb_order | index | index_order_number | index_order_number | 99      | NULL |    1 | Using index |
+----+-------------+----------+-------+--------------------+--------------------+---------+------+------+-------------+
1 row in set (0.00 sec)
4、Using where 查寻
5、Using join buffer :表示当前sql使用了连接缓存。
6、impossible where :where 字句 总是false ,mysql 没法猎取数据行。
7、select tables optimized away:
8、distinct:

以上就是mysql explain的作用是啥?的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有156人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板