MariadDB 查询中可以使用SELECT的前面使用EXPLAIN来查看索引的使用情况,接下来,我们来描述一下,explain所产生的一些信息。
EXPLAIN SELECT clause;
获取查询执行计划信息,用来查看查询优化器如何执行查询
EXPLAIN SELECT * FROM students WHERE Name='Di Yun'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: students
type: ref
possible_keys: stuName
key: stuName
key_len: 152
ref: const
rows: 1
Extra: Using index condition
id
当前查询语句中,每个SELECT的编号,
复杂查询有三种
简单子查询
用于FROM的子查询
联合查询
联合查询会出现一个匿名表
EXPLAIN SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers ORDER BY Age;
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+
| 1 | PRIMARY | students | ALL | NULL | NULL | NULL | NULL | 26 | |
| 2 | UNION | teachers | ALL | NULL | NULL | NULL | NULL | 4 | |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using filesort |
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+
select_type
简单查询为simple
复杂查询:
SUBQUERY:简单子查询
DERIVED:用于FROM中的子查询
UNION:UNION语句的第一个之后的SELECT语句
UNION RESULT:匿名临时表
table
SELECT语句关联到的表
type
关联类型,或访问类型,即Mariadb决定如何去查询表中的行的方式
ALL:全表扫描
index:根据索引的次序进行全表扫描;如果在Extra列出现“Using index”表示使用覆盖索引
而非全表扫描
range:有范围限制的根据索引实现范围扫描,扫描位置起始于某一点,结束于另一点
eq_ref:仅返回一个行,但需要与额外与某个参数进行比较
ref:根据索引返回表中匹配某单个值的所有行
const,system:直接返回单个行
possible_keys:
查询可能会用到的索引
key:
查询中使用了的索引
key_len:
索引使用的字节数
ref:
再利用key字段所表示的索引完成查询时所有的列或某常量值
rows:
Mariadb估计为找到目标所读取的行数
Extra
额外信息
Using index:将会使用覆盖索引,以避免访问表
Using where:Mariadb服务器将在存储引擎检索后,在进行一次过滤
Using temporary:使用临时表
Using filesort:对结果使用一个外部索引排序