基本的语法
EXPLAIN
select * from table
id
数字越大越先执行,一样大则从上往下执行,如果为NULL则表示是结果集,不需要用来查询。
select_type
simple
:不需要union
的操作或者是不包含子查询的简单select语句
。primary
:需要union
操作或者含有子查询的select语句
。union
:连接两个select
查询,第一个查询是dervied
派生表,第二个及后面的表select_type
都是union
。dependent union
:与union
一样,出现在union
或union all
语句中,但是这个查询要受到外部查询的影响
。union result
:包含union
的结果集。subquery
:除了from
字句中包含的子查询外,其他地方出现的子查询都可能是subquery
。dependent subquery
:与dependent union
类似,表示这个subquery的查询要受到外部表查询的影响
。derived
:from字句中出现的子查询
,也叫做派生表
,其他数据库中可能叫做内联视图或嵌套select。
table
表名,如果是用了别名,则显示别名
type
依次从好到差:system
>const
>eq_ref
>ref
>fulltext
>ref_or_null
>unique_subquery
>index_subquery
>range
>index_merge
>index
>ALL
,除了ALL
之外,其他的type
都可以使用到索引,除了index_merge
之外,其他的type
只可以用到一个索引。
type要努力优化到range级别,all要尽量少的出现
关于这些type
的解释:
system
:表中只有一行数据或者是空表。const
:使用唯一索引或者主键,返回记录一定是1行记录的等值where
条件时,通常type
是const
。eq_ref
:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null
,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
。ref
:不像eq_ref
那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。fulltext
:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql
不管代价,优先选择使用全文索引。ref_or_null
:与ref
方法类似,只是增加了null
值的比较。实际用的不多。unique_subquery
:用于where
中的in
形式子查询,子查询返回不重复值唯一值。index_subquery
:用于in
形式子查询使用到了辅助索引或者in
常数列表,子查询可能返回重复值,可以使用索引将子查询去重。range
:索引范围扫描,常见于使用>
,<
,is null
,between
,in
,like
等运算符的查询中。index_merge
:表示查询使用了两个以上的索引,最后取交集或者并集
,常见and
,or
的条件使用了不同的索引。index
:索引全表扫描,把索引从头到尾扫一遍
,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。ALL
:这个就是全表扫描数据文件
,然后再在server
层进行过滤返回符合要求的记录。
possible_keys
查询可能使用到的索引。
key
查询真正使用到的索引。
key_len
用于处理查询的索引长度。
ref
常数等值查询(就是直接"AAA=BBB"的查询)显示const,连接查询则显示表的关联字段。
rows
执行计划中估算的扫描行数,不是精确值。理论上说是越少越好,越少说明索引用越精确.需要扫描的行数越少.
filtered
表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例。
extra
extra代表使用了哪些操作来筛选数据
Extra
为Using where
说明,SQL
使用了where
条件过滤数据。
Extra
为Using index
说明,SQL
所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。
Extra
为Using index condition
说明,确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
Extra
为Using filesort
说明,得到所需结果集,需要对所有记录进行文件排序(常见的就是order by
中的列没有在索引上)。
Extra
为Using temporary
说明,需要建立临时表(temporary table)
来暂存中间结果。
Extra
为Using join buffer (Block Nested Loop)
说明,需要进行嵌套循环计算。
索引长度限制
mysql版本 <= 5.7.6
- Mysql Innodb默认单列索引最大长度767bytes,一般我们认为是255字符。
- 当索引字段长度超过时,如果是unique的会提示失败。如果是非唯一的,会自动截取前255位作为索引键。
mysql版本 >= 5.7.7
在该版本情况下,由于 InnoDB 引擎的 innodb_large_prefix 等选项默认值改变,单字段索引长度限制增大。
如果是单字段索引,则字段长度不应超过 3072
字节。
如果是联合索引,则每个字段长度都不应超过 3072
字节,且所有字段长度合计不应超过 3072
字节。
这种情况下,常见字符集和引擎组合后的字符长度限制如下: