1、 如何查看mysql执行计划?
示例:explain SELECT * FROM tableName;
执行结果以下: mysql
参数说明:
一、id:SELECT的查询序列号:
二、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分类以下:
system:表只有一行;
const:表最多只有一行匹配,通用用于主键或者惟一索引比较时;
eq_ref:惟一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配,常见于主键或惟一索引扫描
ref:非惟一性索引扫描,返回匹配某个单独值得全部行;
fulltext:全文搜索
ref_or_null:与ref相似,但包括NULL;
index_merge:索引合并优化,但不包括跨表和全文索引;
unique_subquery:用于where中的in形式子查询,子查询返回不重复值惟一值;
index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值;
range:只检索给定范围的行;
index:读全表,index只遍历索引树;
ALL:表示全表扫描。
性能由好到坏排序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL;
五、possible_keys:显示可能应用在表中的索引,possible_keys的值一个或多个
六、key:实际使用到的索引;
七、key_len:索引中使用到的字节数,长度越短越好;
八、ref:显示索引的哪一列被使用了;九、rows:根据表统计信息及索引选用状况,找到所须要读取的行数;
九、filtered:返回结果的行占须要读到的行(rows列的值)的百分比;
十、Extra:包含不适合在其它列中显示但十分重要的额外信息。
2、执行计划的限制
一、没法展现存储过程,触发器,UDF对查询的影响
二、没法使用EXPLAIN对存储过程进行分析sql