mysql-索引(B+ Tree结构、Hash结构)

image.png

1、索引数据结构:

  • Hash结构:底层是哈希表,哈希表是一种key-value存储数据,多个数据在存储关系上完全没有顺序关系。对于区间查询是无法通过索引查询,就需要全表扫描。所以哈希索引只适用等值查询场景。

  • B+ Tree结构


    Hash结构局限性:

    • Hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询,无法被用来避免数据的排序操作。
      因为经过相应的Hash算法处理之后的Hash值的大小关系,并不能保证和Hash运算前完全一样;

    • Hash索引不能利用部分索引键查询。

      对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值,而不是单独计算Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用;

    • Hash索引在任何时候都不能避免全表扫描。

      由于不同索引键存在相同Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要回表查询数据.

    • Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B+树索引高。


    B+ Tree索引和Hash索引区别?

1、哈希索引适合等值查询,但是无法进行范围查询 。
2、哈希索引没办法利用索引完成排序 。
3、哈希索引不支持多列联合索引的最左匹配规则 。
4、如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。

2、索引种类:

  • 聚簇索引:在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引。

  • 非聚簇索引:而索引B+ Tree的叶子节点存储了主键的值的是非主键索引。

  • 覆盖索引:减少回表次数,降低IO。


    聚簇与非聚簇索引区别?

    • 主键索引树的叶子节点直接就是我们要查询的整行数据。

    • 非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次回表查询。

      非主键索引检索过程不全都是上面的描述:

      ​ 覆盖索引:一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。

      eg:

      covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。

      当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表。

    组合索引

          MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候。
          eg:如(key1,key2,key3),等价于创建了:

  • (key1)
  • (key1,key2)
  • (key1,key2,key3)三个索引,这就是最左匹配原则

你可能感兴趣的:(mysql-索引(B+ Tree结构、Hash结构))