共计 1014 个字符,预计需要花费 3 分钟才能阅读完成。
什么叫做覆盖索引?
解释一:就是 select 的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
解释二:索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
解释三:是非聚集组合索引的一种形式,它包括在查询里的 Select、Join 和 Where 子句用到的所有列(即建立索引的字段正好是覆盖查询语句 [select 子句] 与查询条件 [Where 子句] 中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以 MySQL 只能使用 B -Tree 索引做覆盖索引
当发起一个被索引覆盖的查询 (也叫作索引覆盖查询) 时,在 EXPLAIN 的 Extra 列可以看到“Using index”的信息。
注:遇到以下情况,执行计划不会选择覆盖查询。
- select 选择的字段中含有不在 索引 中的字段,即索引没有覆盖全部的列。
- where 条件中不能含有对索引进行 like 的操作。
mysql 聚集索引,辅助索引,联合索引,覆盖索引
聚集索引:
一个表中只能有一个,聚集索引的顺序与数据真实的物理存储顺序一致。查询速度贼快,聚集索引的叶子节点上是该行的所有数据,数据索引能加快范围查询(聚集索引的顺序和数据存放的逻辑顺序一致)。主键!= 聚集索引。
辅助索引 (非聚集索引):
一个表中可以有多个,叶子节点存放的不是一整行数据,而是键值,叶子节点的索引行中还包含了一个 ’ 书签 ’,这个书签就是指向聚簇索引的一个指针,从而在聚簇索引树中找到一整行数据。
联合索引:
就是由多列组成的的索引。遵循最左前缀规则。对 where,order by,group by 都生效。
覆盖索引:
指从辅助索引中就能获取到需要的记录,而不需要查找聚簇索引中的记录。使用覆盖索引的一个好处是因为辅助索引不包括一条记录的整行信息,所以数据量较聚集索引要少,可以减少大量 io 操作。
聚集索引与辅助索引的区别:
叶子节点是否存放的为一整行数据
最左前缀规则:
假设联合索引由列 (a,b,c) 组成,则一下顺序满足最左前缀规则:a、ab、abc;selece、where、order by、group by 都可以匹配最左前缀。其它情况都不满足最左前缀规则就不会用到联合索引。