查询是数据库中最频繁的操作,提高查询速度可以有效的提高 MySQL 数据库的性能。在《如何定位效率低下的SQL语句》一节我们了解了如何查询效率低下的 SQL 语句,本节主要介绍如何分析查询语句。
通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询语句。在 MySQL 中,可以使用 EXPLAIN 和 DESCRIBE 获取 MySQL 执行 SELECT 语句的信息,来分析查询语句。
EXPLAIN 语句的基本语法如下:
“SELECT 语句”参数一般为数据库查询命令,如“SELECT * FROM tb_student”。通过 EXPLAIN 关键字可以分析后面 SELECT 语句的执行情况,并且能够分析出所查询表的一些内容。
下面使用 EXPLAIN 语句来分析一个查询语句。代码执行如下:
mysql> EXPLAIN SELECT * FROM tb_student \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tb_student partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 7 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.01 sec)
对以上结果中参数说明如下:
表示 SELECT 语句的编号,也就是在整个查询中 SELECT 的位置。如果在语句中没子查询或关联查询,只有唯一的 SELECT,每行都将显示 1。否则,内层的 SELECT 语句一般会顺序编号,对应于其在原始语句中的位置。
表示 SELECT 语句的类型,该参数有以下几个常用的取值:
表示查询的表;
表示表的连接类型。该参数有以下几个常用的取值,范围从 NULL 到 ALL。下面按照最佳类型到最差类型排序:
表示查询中可以使用的索引;
表示实际查询中使用到的索引;
表示索引字段的长度;
表示使用哪个列或常数与索引一起来查询记录;
表示查询的行数;
MySQL 5.7 版本之前使用 EXPLAIN EXTENDED 时会出现这个字段,MySQL 5.7 版本之后包括 5.7 版本默认就有这个字段。这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询记录数量的比例。注意是百分比,不是具体记录数。
表示查询过程的附件信息。
DESCRIBE 语句的使用方法与 EXPLAIN 语句一样,DESCRIBE 语句的语法形式如下:
DESCRIBE 可以缩写成 DESC。
下面使用 DESCRIBE 语句来分析一个查询语句。代码执行如下:
mysql> DESCRIBE SELECT * FROM tb_student \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tb_student partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 7 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
可以看出,以上运行结果与例 1 基本相同,这里不再对上述参数进行说明,参考例 1 即可。