• MySQL 索引结构 hash 有序数组


    MySQL 索引结构 hash 有序数组

    除了最常见的树形索引结构,Hash索引也有它的独到之处。

     

    Hash算法

    • Hash本身是一种函数,又被称为散列函数。

    • 它的思路很简单:将key放在数组里,用一个hash算法把不同的key转换成一个确定的value,然后放在这个数组的指定位置

      相同的输入永远可以得到相同的输出

    • 具体的算法有MD5、SHA1、SHA2、SHA3

    • Hash冲突:不同的key得到了相同的value

      当出现Hash冲突,可以在冲突发生的位置跟一个链表

     

    Hash索引

    索引使用的数据结构的特性会让索引也具有不同的特性:

    • Hash索引只适用于等值查询的场景,区间查询速度很慢

      因为经过hash函数处理后,即便是原本有序的输入,最后存放的位置也会变为无序的。

    • 检索速度很快

      索引检索一次到位,而不需要想B+树那样从根节点访问到叶子节点。不过在有大量重复值得情况下,hash索引的效率极低,因为要频发地处理Hash冲突。

    • 无法完成排序,模糊查询

      因为它们本质上是范围查询

    • 不支持多列联合索引的最左匹配原则

      对于Hash索引的联合索引,是将联合索引字段值相捆绑然后计算Hash值的,无法利用对单一字段的Hash值

    Hash索引的用途:

    • Hash索引更多地使用在键值型的数据库中,比如Redis

    • MySQL的Memory存储引擎支持Hash存储

      如果我们需要用到查询的临时表时,就可以选择 Memory 存储引擎,把某个字段设置为 Hash 索引,比如字符串类型的字段,进行 Hash 计算之后长度可以缩短到几个字节。当字段的重复度低,而且经常需要进行等值查询的时候,采用 Hash 索引是个不错的选择

    • InnoDB自适应Hash索引

      当某个索引值使用非常频繁的时候,它会在 B+ 树索引的基础上再创建一个 Hash 索引,这样让 B+ 树也具备了 Hash 索引的优点。

     

    有序数组

    如果我们使用有序数据作为索引结构的话,那么

    • 等值查询和范围查询的性能都十分优秀
    • 但是插入和删除的成本太大

    因此有序数组的结构只适合静态存储引擎,如果我们要存储以某种有序编号为序的不轻易增删的历史数据,我们可以使用有序数组作为索引结构。

     

  • 相关阅读:
    Spring简介和基础
    el表达式
    Spring MVC 文件上传下载
    el表达式的function标签
    JSTL核心标签库使用
    基于注解的SpringMVC
    new一个Object对象占用多少内存?
    leetcode-第k个排列(Java和c++版)
    使用maven构建web项目(简易版)
    leetcode-电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/G-Aurora/p/13246047.html
Copyright © 2020-2023  润新知