mysql explain的作用有哪些?
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的作用是啥?的具体内容,更多请关注百分百源码网其它相关文章!