mysql索引explain参数解释;及索引长度限制

基本的语法

EXPLAIN
select * from table

在这里插入图片描述

id

数字越大越先执行,一样大则从上往下执行,如果为NULL则表示是结果集,不需要用来查询。

select_type

  1. simple:不需要union的操作或者是不包含子查询的简单select语句
  2. primary:需要union操作或者含有子查询的select语句
  3. union:连接两个select查询,第一个查询是dervied派生表,第二个及后面的表select_type都是union
  4. dependent union:与union一样,出现在unionunion all语句中,但是这个查询要受到外部查询的影响
  5. union result:包含union的结果集。
  6. subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
  7. dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
  8. derivedfrom字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套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的解释:

  1. system:表中只有一行数据或者是空表。
  2. const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常typeconst
  3. eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
  4. ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。
  5. fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引。
  6. ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。
  7. unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值。
  8. index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
  9. range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。
  10. index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见andor的条件使用了不同的索引。
  11. index索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
  12. ALL:这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

possible_keys

查询可能使用到的索引。

key

查询真正使用到的索引。

key_len

用于处理查询的索引长度。

ref

常数等值查询(就是直接"AAA=BBB"的查询)显示const,连接查询则显示表的关联字段。

rows

执行计划中估算的扫描行数,不是精确值。理论上说是越少越好,越少说明索引用越精确.需要扫描的行数越少.

filtered

表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例。

extra

extra代表使用了哪些操作来筛选数据
在这里插入图片描述
ExtraUsing where说明,SQL使用了where条件过滤数据。
ExtraUsing index说明,SQL所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。
ExtraUsing index condition说明,确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
ExtraUsing filesort说明,得到所需结果集,需要对所有记录进行文件排序(常见的就是order by中的列没有在索引上)。
ExtraUsing temporary说明,需要建立临时表(temporary table)来暂存中间结果。
ExtraUsing 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 字节。
这种情况下,常见字符集和引擎组合后的字符长度限制如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值