EXPLAIN命令
除了以SELECT开头的查询语句,其余的DELETE、INSERT、REPLACE以及UPDATE语句前边都可以加上EXPLAIN这个词儿,用来查看这些语句的执行计划
Type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,以下是集中查询的访问方法。查找数据行记录的大概范围。
依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
-
ALL 全表扫描
-
index 这个和全表扫描是一样的。不过是按照索引的次序进行全表扫描,而不是行。也就是避免了排序的操作。不是随机访问的,效率比ALL稍微高一点点。
-
range 范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
-
Ref 索引访问。但找到并不一定是一行,可能是多行。非唯一索引,或者主键索引
-
const/system。非常的快。mysql能对查询的某部分进行优化并将其转化成一个常量。用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system
Possible_key列
possible_keys列显示查询可能使用哪些索引来查找。
key列
key列显示mysql实际采用哪个索引来优化对该表的访问。 如果没有使用索引,则该列是 NULL
这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
rows列
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。
如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数。