mysql高效索引之覆盖索引

什么叫作覆盖索引?mysql

解释一: 就是select的数据列只用从索引中就可以取得,没必要从数据表中读取,换句话说查询列要被所使用的索引覆盖。sql

解释二: 索引是高效找到行的一个方法,当能经过检索索引就能够读取想要的数据,那就不须要再到数据表中读取行了。若是一个索引包含了(或覆盖了)知足查询语句中字段与条件的数据就叫作覆盖索引。指针

解释三:是非汇集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的全部列(即创建索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的全部数据)。
 不是全部类型的索引均可以成为覆盖索引。覆盖索引必需要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,因此MySQL只能使用B-Tree索引作覆盖索引
当发起一个被索引覆盖的查询(也叫做索引覆盖查询)时,在EXPLAIN的Extra列能够看到“Using index”的信息。索引

注:遇到如下状况,执行计划不会选择覆盖查询。io

  1. select选择的字段中含有不在 索引 中的字段 ,即索引没有覆盖所有的列。
  2. where条件中不能含有对索引进行like的操做。

mysql汇集索引,辅助索引,联合索引,覆盖索引select

汇集索引:
一个表中只能有一个,汇集索引的顺序与数据真实的物理存储顺序一致。查询速度贼快,汇集索引的叶子节点上是该行的全部数据 ,数据索引能加快范围查询(汇集索引的顺序和数据存放的逻辑顺序一致)。主键!=汇集索引。方法

辅助索引(非汇集索引):
一个表中能够有多个,叶子节点存放的不是一整行数据,而是键值,叶子节点的索引行中还包含了一个'书签',这个书签就是指向聚簇索引的一个指针,从而在聚簇索引树中找到一整行数据。数据

联合索引:
就是由多列组成的的索引。遵循最左前缀规则。对where,order by,group by 都生效。查询

覆盖索引:
指从辅助索引中就能获取到须要的记录,而不须要查找聚簇索引中的记录。使用覆盖索引的一个好处是由于辅助索引不包括一条记录的整行信息,因此数据量较汇集索引要少,能够减小大量io操做。index

汇集索引与辅助索引的区别:
叶子节点是否存放的为一整行数据

最左前缀规则:假设联合索引由列(a,b,c)组成,则一下顺序知足最左前缀规则:a、ab、abc;selece、where、order by 、group by均可以匹配最左前缀。其它状况都不知足最左前缀规则就不会用到联合索引。

相关文章
相关标签/搜索