文章

聚集索引非聚集索引区别,覆盖索引

聚集索引非聚集索引区别,覆盖索引

Mysql支持的索引类型

  • B+树索引
  • 哈希索引
  • 空间数据索引
  • 全文索引

B+树

适合用B+树索引的查询类型:

  1. 全值匹配
  2. 最左前缀匹配
  3. 列前缀匹配
  4. 范围匹配
  5. 精确匹配某一列并范围匹配另一列
  6. 只范围跟索引的查询

局限性:

  1. 如果不是按照索引的最左列开始查找,那么无法使用索引
  2. 不能跳过索引中的列
  3. 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询。

哈希索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引计算一个哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

限制:

  1. 哈希索引只包含哈希值和行指针,而不存储字段值
  2. 哈希索引数据不是按照索引值的顺序排序的,所以无法用于排序
  3. 不支持部分所以列匹配查找
  4. 只支持等值比较查询
  5. 哈希冲突较多的话,索引维护操作的代价也会很高

空间数据索引

MyISAM 表支持空间索引,可以用作地理数据存储。这类索引无须前缀查询。空间索引会从所有维度来索引数据。这一类型索引,接触的很少,以后碰到再做详细总结

全文索引

特殊类型的索引,它查找的时文本中的关键词

聚簇索引和非聚簇索引

聚簇索引

数据行的物理顺序与列值的顺序相同

所以只能建立一个聚集索引InnoDB中的主键索引,叶子节点中存储的就是行数据,行数据在物理存储器中的真实地址就是按照主键索引树形成的顺序进行排列的

所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。

聚簇索引的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序(因为在真实物理存储器的存储顺序只能有一种,而插入新数据必然会导致主键索引树的变化,主键索引树的顺序发生了改变,叶子节点中存储的行数据也要随之进行改变,就会发生大量的数据移动操作,所以效率会慢)。

非聚簇索引

索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引

非聚集索引的叶节点仍然是索引节点,只是有一个指针指向对应的数据块,如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行二次查询,查询节点上对应的数据行的数据

如何解决非聚集索引中二次查询问题

覆盖索引

建立两列以上的索引,即可查询复合索引里的列的数据而不需要进行回表二次查询。

要注意使用复合索引需要满足最左侧索引的原则,也就是查询的时候如果where条件里面没有最左边的一到多列,索引就不会起作用。

总结

  1. 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁的去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
  2. 非聚集索引在查询的时候,如果可以尽量避免二次查询,这样性能会大幅提升。
  3. 不是所有的表都适合建立索引,只有数据量大的表才适合建立索引,且建立在选择性高的列上面性能会更好。
本文由作者按照 CC BY 4.0 进行授权