前言
通常我们使用SQL查询是如何判断SQL的健康程度呢?我们会根据SQL查询时间来判断快慢,还有别的方法吗?
简介
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句
使用
EXPLAIN SELECT * FROM tb_account_user WHERE ID=1
------------------------------------------------------------------------------------------------------
id select_type table type possible_keys key key_len ref rows Extra
------ ----------- --------------- ------ ------------- ------ ------- ------ ------ --------
1 SIMPLE tb_account_user system PRIMARY (NULL) (NULL) (NULL) 1
EXPLAIN列的解释
id | 表示查询(select)的类型:simple(简单表),primary(主查询),union(union中的第二个或者是后面的查询语句),subquery(子查询第一个查询) |
select_type | SELECT类型,可以为以下任何一种: ● SIMPLE:简单SELECT(不使用UNION或子查询) ● PRIMARY:最外面的SELECT ● UNION:UNION中的第二个或后面的SELECT语句 ● DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询 ● UNION RESULT:UNION 的结果 ● SUBQUERY:子查询中的第一个SELECT ● DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询 ● DERIVED:导出表的SELECT(FROM子句的子查询) |
table | 输出结果集的表 |
type | 表示表中查找所需的行的方式 ● type=ALL,全表扫描,遍历全表来找到匹配的行 ● type=index 索引全扫描,遍历整个索引来查询匹配的行 ● type=range 索引范围扫描,常见于>,>=,<,<=,between等操作符 ● type=ref 使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行 ● type=eq_ref 使用的唯一就是唯一索引 ● type=const/system 单表中最多有一个匹配行 ● type=null 不用访问表或者索引,直接能够得到结果 ● type=ref_or_null 查询包含null的查询 ● type=index_merge 索引合并优化 ● type=unique_subquery in的后面是一个查询主字段的数据 ● type=index_subquery in在后面查询非唯一索引字段的子查询 |
possible_keys | 查询中可能使用的索引 |
key | 表示查询索引 |
key_len | 索引的长度 |
rows | 扫描中的数量 |