• #">四、哈希索引#
    • #">(一)哈希索引是什么#
    • #">(二)不同存储引擎对哈希索引的支持#
      • #">(1) Memory引擎的哈希索引#
      • #">(2) NDB集群引擎的哈希索引#
      • #">(3) InnoDB引擎的哈希索引#
    • #">(三)哈希索引的优势、限制及适用场景#

    https://www.cnblogs.com/JasonCeng/p/12044109.html

    四、哈希索引#

    (一)哈希索引是什么#

    1. 哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。<br /> 对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,并在哈希表中保存指向每个数据行的指针。hash索引任何时候都需要回表查询数据<br />![](https://cdn.nlark.com/yuque/0/2020/png/1983805/1596191474577-97645469-e8b7-4f33-baed-1cac0235973c.png#crop=0&crop=0&crop=1&crop=1&height=250&id=NXSjD&originHeight=500&originWidth=938&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=469)

    (二)不同存储引擎对哈希索引的支持#

    表4-1 各存储引擎对哈希索引的支持情况概览

    Memory引擎 NDB集群引擎 InnoDB引擎
    是否支持哈希索引 显示支持,是Memory引擎表的默认索引类型(也支持B-Tree索引) 支持唯一哈希索引,所起作用特殊 自适应哈希索引(adaptive hash index)

    (1) Memory引擎的哈希索引#

    Memory引擎不仅支持唯一哈希索引,还支持非唯一哈希索引。非唯一哈希索引指的是:如果多个列的哈希值相同,索引会以链表的方式存放多个指向不同记录的指针到同一个哈希条目中。
    MySQL索引方式 哈希索引 - 图1
    使用Memory引擎在建表时创建哈希索引

    CREATE TABLE testhash (
        fname VARCHAR(50) NOT NULL,
        Lname VARCHAR(50) NOT NULL,
        KEY USING HASH(fname)
    ) ENGINE=MEMORY;
    

    (2) NDB集群引擎的哈希索引#

        后续将深入阅读官方文档,理解NDB集群引擎中哈希索引的作用:[https://dev.mysql.com/doc/mysql-cluster-excerpt/5.7/en/mysql-cluster-ndbd-definition.html](https://dev.mysql.com/doc/mysql-cluster-excerpt/5.7/en/mysql-cluster-ndbd-definition.html)
    

    (3) InnoDB引擎的哈希索引#

        InnoDB引擎有一个特殊的功能叫“自适应哈希索引(adaptive hash index)”:当InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引,让B-Tree索引也具有哈希索引的一些优点,如快速的哈希查找。<br />       “自适应哈希索引”是一个完全自动的、内部的行为,用户无法控制或配置,不过如果有必要,完全可以关闭该功能。
    

    (三)哈希索引的优势、限制及适用场景#

    (1)优势:哈希索引查找的速度非常快。#
    原因:索引自身只需存储对应的哈希值,使得索引的结构十分紧凑。
    (2)哈希索引的限制#
    1)哈希索引只包含哈希值和行指针,而不存储字段值。hash索引任何时候都需要回表查询数据
    2)不能用于排序。因为哈希索引数据不是按照索引值顺序存储的。
    3)不支持部分索引列匹配查找。因为哈希索引必须使用索引列的全部内容来计算哈希值。
    4)只支持等值比较查询(包括=、IN()、< = >),不支持任何范围查询(如where price > 100)。
    5)当出现哈希冲突时(不同的索引列值却有相同的哈希值),访问速度会变慢。因为存储引擎必须遍历链表中所有的行指针,逐行进行比较,知道找到所有符合条件的行。
    6)若哈希冲突很多,一些索引维护操作的代价也会很高。如:在某个哈希冲突很多的列上建立哈希索引,当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用。冲突越多,代价越大。
    (3)哈希索引的适用场景#
    因为上面的这些限制,使得哈希索引适用的场景比较有限。而一旦适用哈希索引,则它带来的性能提升将非常显著。
    如,在数据仓库应用中有一种经典的“星型”schema,需要许多关联才能建立查找表,哈希索引就非常适合查找表的需求。