时间:2021-05-24
在MySQL优化的环节上,我们首先需要知道的就是我们当前的这句SQL语句在实际的数据库中究竟是怎么执行的,才能谈要如何优化它。而在MySQL中,就给我们提供了模拟语句执行的一个非常好用的关键字:EXPLAIN。EXPLAIN可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。因此今天我们就来讲一讲这个关键字的一些基础的用法与应用。
EXPLAIN的使用方法非常简单:
mysql> EXPLAIN SELECT * FROM user;简单来说,就是在原有的SQL语句前面加上EXPLAIN关键字,或者说是在EXPLAIN关键字后跟这你要检查的SQL语句。
EXPLAIN语句的输出结果才是我们想要的数据,也是我们分析的重点。
我们先来看看上面的语句所给到的对应的结果的形式:
EXPLAIN语句给到我们的数据总共有10列,接下来我们看一下一些在性能优化上有比较重要作用的数据列所代表的意思。
这个是select查询的序列号。
当我们的SQL语句是非select语句的时候(即delete,update...),这个字段的值就是对应的操作类型(delete,update...)。
mysql> EXPLAIN INSERT INTO user VAULES(2,'ahong','31');此时的输出select_type就是我们对应的INSERT:
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | INSERT | user | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+而当SQL语句时select语句的时候,他就是对应的一些详细的select的类型,可以有如下几种:
SIMPLE:简单SELECT(不使用UNION或子查询等)PRIMARY:最外面的SELECTUNION:UNION中的第二个或后面的SELECT语句DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询UNION RESULT:UNION的结果。SUBQUERY:子查询中的第一个SELECTDEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询DERIVED:导出表的SELECT(FROM子句的子查询)下面就是一个最简单的SIMPLE查询的例子:
mysql> EXPLAIN SELECT * FROM user;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | user | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+显示这一步操作所访问的数据是关于哪一张表的。
显示表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。这样可以大大的提高查询效率。
这是最重要的一列。显示了连接使用了哪种类别,有无使用索引。是分析查询性能的关键。
结果性能从优到差分别有以下的情况:
而这几种情况所代表的意义如下:
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
显示查询语句有可能会使用到的索引列。取值可能为一个,多个或者null。
key列显示的是该查询语句实际使用的索引列。如为null,则表示没有使用索引。
展示一下possible_key和key的实际效果:
下面是一个在age列上建立索引的数据表,我们进行以下的查询
会得到以下的结果:
+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+| 1 | SIMPLE | user | NULL | ref | age | age | 5 | const | 1 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+------+---------+-------+------+----------+-------+显示的是当前的查询语句所使用的索引的长度。在不损失精确性的情况下,长度越短越好.
引用到的上一个表的列。
根据表的情况和查询语句的情况,MySQL会估算出返回最终结果所必须检查的行的数量。该列的值越大查询效率越差。
一个百分比的值,和rows 列的值一起使用,可以估计出查询执行计划(QEP)中的前一个表的结果集,从而确定join操作的循环次数。小表驱动大表,减轻连接的次数。
关于MySQL如何解析查询的额外信息,主要有以下几种:
Extra中包含的值:
以上就是MySQL EXPLAIN语句的使用示例的详细内容,更多关于MySQL EXPLAIN语句的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
EXPLAIN语句提供有关MySQL如何执行语句的信息。EXPLAIN与SELECT,DELETE,INSERT,REPLACE和UPDATE语句一起使用。EX
在MySQL查询语句过程和EXPLAIN语句基本概念及其优化中介绍了EXPLAIN语句,并举了一个慢查询例子:可以看到上述的查询需要检查1万多记录,并且使用了临
我们知道分析MySQL语句查询性能的方法除了使用EXPLAIN输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称
优化查询使用Explain语句分析查询语句Explain用来分析SELECT查询语句,开发人员可以通过分析Explain结果来优化查询语句。通过对查询语句的分析
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句。 使用方法:在select语句前