美文网首页
mysql-索引(B+ Tree结构、Hash结构)

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

作者: tianlang136520 | 来源:发表于2019-08-08 15:48 被阅读0次
    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结构)

          本文链接:https://www.haomeiwen.com/subject/ekbxjctx.html