Hash 索引

哈希算法在数据库索引中的高效应用 本文旨在揭示哈希算法在数据库索引中的魔法效果,重点讲解其工作原理、实现方式、性能优势以及适用场景。覆盖范围从基础概念到实际应用,适合需要优化数据库查询性能的开发者和架构师。哈希函数:将任意长度输入转换为固定长度输出的魔法配方(如MD5)哈希桶:存储数据的容器,就像超市的寄存柜碰撞概率:两个不同数据被分到同一个柜子的可能性哈希函数是数据的"数字指纹生成器"哈希桶像智能快递柜的分拣系统碰撞处理是应对柜门冲突的应急预案。 阅读详情

8.4.2  Hash 索引

Hash 索引在 MySQL 中使用的并不是很多,目前主要是 Memory和NDB Cluster存储引擎使用。所谓 Hash 索引,实际上就是通过一定的 Hash 算法,将须要索引的键值进行 Hash 运算,然后将得到的 Hash 值存入一个 Hash 表中。每次须要检索的时候,都会将检索条件进行相同算法的 Hash 运算,再和Hash 表中的 Hash 值进行比较,并得出相应的信息。

在 Memory 存储引擎中,MySQL 还支持非唯一的 Hash 索引。可能很多人会比较惊讶,如果是非唯一的 Hash 索引,那相同的值该如何处理呢?在 Memory 存储引擎的 Hash 索引中,如果遇到非唯一值,存储引擎会将它们链接到同一个Hash 键值下,并以一个链表的形式存在,然后在取得实际键值时过滤不符合的键。

由于 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

(3)Hash 索引不能利用部分索引键查询。

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

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

数据库伪哈希Hash索引的创建和使用(理论+实战) 适用场景 适用于给一个varchar类型的字段建立索引。比如说类的全路径,URL等长字符串的字段。 com.xxx.aaa.bbb.ccc.yyy.ZZZ 其中大写的ZZZ就是类名。 像这种长字符串的,建立前缀索引区分度也不大,尤其一般前缀索引只使用10个字符,那么区分度可以说非常小。 所以,这种情况下,就可以考虑使用伪哈希索引。我们可以创建一个短的带有 b+tree索引的字段。 innodb也... 阅读详情

相关推荐

第38讲:MySQL索引结构之Hash索引数据结构

如下图所示,我们想对user_name这一列添加hash索引,首先会将user_name这一列的字段内容转换成新的hash值,然后通过hash函数将数据写入到对应的槽位上,例如小红这条的数据,通过hash函数计算出要分配的槽位,然后会将索引字段的值和这一条数据的hash值都写入到槽位中,在查询小红这条数据时,通过槽位中记录的hash值就可以找到对应的这条数据。哈希索引就是采用了一定的HASH算法,将key元素换成新的hash值,然后映射到对应的槽位上,最终存储在hash表。无法利用索引完成排序操作。

江晓龙的博客 8489

MySQL查连续记录、天数(2次或3次都可)的思路

文章目录1、查找连续记录2、查找连续n条记录 1、查找连续记录 问题好像是来源于力扣601题,因此做个记录。我随便造了一个数据,如下表 con id 赵 3 钱 10 孙 11 李 12 周 13 吴 14 郑 17 王 18 秦 19 汉 4 宋 21 元 22 明 23 皇甫 1 我们要找出id连续的记录,比如【3,4】;【21,22,23】等。思路如下,分为两步 1、 如果按照id升序排序,lag(1)位,找到二者差值为1的记录,

weixin_42283422的博客 1402

用My SQL查询连续的数字(连续出现问题)

最近在leetcode上刷题的时候,发现了一个比较有代表性的查询连续出现数字的问题。当然这个连续出现问题可以是很多,连续签到、连续登陆等。这个时候需要用到自连接,自连接也就是把一张表当两张表用。 比如这道题: 为了看起来舒服一些,我在自己的workbench上测试的时候没有用这张表,不过道理是一样的。 1、先建表 # 先建立一张试验用的表stu_score。 create table stu_score(id int not null, fenshu int not null,primary key(id)); insert into stu_score(id,fenshu) value(1

BTREE索引与HASH索引

水电费

小浪与艳花 4362

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4656

Windows 11 IoT企业版LTSC 24H2/25H2中文版安装指南(含OEM激活教程)

本文详细介绍了Windows 11 IoT企业版LTSC 24H2/25H2中文版的安装与OEM激活全流程。从系统镜像准备、硬件兼容性检查到自动化安装配置,再到OEM激活方案(包括SLIC注入和数字许可证激活),为工业自动化、数字标牌等物联网设备提供稳定可靠的系统部署指南。

weixin_29198045的博客 8814

btree索引和hash索引的区别

btree索引和hash索引的区别 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。 可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事...

D_estin_y的博客 399

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

Hash索引和BTree索引区别

Hash仅支持=、>、>=、<、<=、between。BTree可以支持like模糊查询 索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。 我们在mysql中常用两...

weixin_44694538的博客 1556

【新手必看】蓝牙的HOGP和HID、GATT有什么区别和联系

让新手宏观了解蓝牙HOGP、HID、GATT这三个协议的区别和联系

qq_51976334的博客 1565

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3258

人大金仓数据库KingbaseES索引类型

为了组合多个索引,系统扫描每个需要的索引,然后在内存里组织一个BITMAP,它将给出索引扫描出的数据在数据表中的物理位置。需要注意的是,考虑到Bitmap索引的存储结构,对Bitmap索引相关列的Update操作将会导致Bitmap索引的解压缩和重压缩,因此性能会较为缓慢。与执行节点的Bitmap索引的区别是:执行节点的Bitmap索引是将计算过程需要的数据以位图的形式进行运算,而索引AM的Bitmap索引是将索引信息压缩存储在磁盘上。Btree是索引是最常见的索引类型,也是KES的默认索引,适用于。

arthemis_14的博客 1389

YOLOV8改进:添加Wiseiou,有效涨点

【代码】YOLOV8改进:添加Wiseiou,有效涨点。

AIcurator的博客 2391

MySQL(InnoDB剖析):---哈希算法与自适应哈希索引

一、哈希算法 哈希算法是一种常见算法,时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据库结构 二、哈希表 哈希表也称散列表,由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。加入某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,...,m-1}的关键字。同时假设没有两个元素具有相同的关键字 用一个数组(即直接寻址表)T[0...m-1]表示动态集合,其中每个位置(或称槽或桶)对应全域U中的一个关键字。图5-38.

m0_46405589的博客 497

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集的建立

运动物体的微多普勒效应为人体动作识别提供了可能,基于雷达的居家检测具有良好的隐私保护性,且不易受环境因素影响(如光照、温度等),近年来已受到国内外学者的广泛关注。基于雷达与深度学习的摔倒检测使用自建的雷达数据集进行人体摔倒检测的研究。雷达数据集的建立分为雷达数据采集和雷达数据处理两部分工作。

洋洋Young的博客 3403

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MySQL(InnoDB剖析):28---哈希算法与自适应哈希索引

哈希也可以参阅本文数据结构文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103517420 一、哈希算法 哈希算法是一种常见算法,时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据库结构 二、哈希表 哈希表也称散列表,由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。加......

董哥的黑板报 1286

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mysql怎么创建hash索引_mysql索引教程之哈希索引

本节内容:mysql索引之哈希索引哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。对于每一行,存储引擎计算出了被索引的哈希码(Hash Code),它是一个较小的值,并且有可能和其他行的哈希码不同。它把哈希码保存在索引中,并且保存了一个指向哈希表中的每一行的指针。在mysql中,只有memory存储引擎支持显式的哈希索引。如果多个值有相同的哈希码,索...

weixin_42139871的博客 1661

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数据库中的Hash索引以及哈希碰撞

mysql的存储引擎当前默认为InnoDB,而它不支持hash索引,但是它会在特定的条件下,自动将B+树转换为hash结构。hash索引,就是用过一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。如果我的两个name字段计算出来的key相同,那么就会产生冲突,这就是我们所说的哈希冲突,也称之为哈希碰撞。3.查询效率极高,通常只需要一次检索就可以了(不出现hash碰撞的情况),效率要高于B+树索引。就比如下面的name字段,经过算法的分析,就会对应出一张hash表。

adru的博客 756

哈希索引和B+树索引的区别 (Hash索引 和 B+tree索引 区别)

前段时间被问到Hash索引和B+tree索引的区别,一时间没回答上来,这边做下记录。 索引 索引是对数据库表中一列或多列的值进行处理后的一种结构,使用索引可快速访问数据库表中的特定信息。本文主要对Hash索引和B+tree索引的区别做说明,如果不了解B+tree 索引的老铁可以先了解下B+tree,后面我会再补一个B+tree 索引的内容。 Hash索引概念 说到Hash,老铁们很容易联想到HashMap,没错,Hash索引的结构和HashMap相类似,键值 key 通...

程序猿老王的博客 1万+

mysql 索引 hash_MySQL索引之哈希索引

0x00.About索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。从MySQL逻辑架构来看,MySQL有三层架构,第一层连接,第二层查询解析、分析、优化、视图、缓存,第三层,存储引擎。索引通过分开查询片,节省了扫描查找时间,大大提升查询效率。大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。索引主要在存储引...

weixin_35705450的博客 559

【mysql】索引类型之哈希索引

文章目录哈希算法哈希表InnoDB存储引擎中的哈希算法BTree索引和哈希索引的区别 哈希算法 哈希算法时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据结构。 哈希表 哈希表也为散列表,又直接寻址改进而来。在哈希的方式下,一个元素k处于h(k)中,即利用哈希函数h,根据关键字k计算出槽的位置。函数h将关键字域映射到哈希表T[0…m-1]的槽位上。 图一,哈希函数h,根据关键字k计算出槽的位置 上图中哈希函数h有可能将两个不同的关键字映射到相同的位置,这叫做碰撞,在数据库中一般采用链接

m0_45406092的博客 507

PostgreSQL索引篇 | Hash索引

PostgreSQL版本为8.4.1 (本文为《PostgreSQL数据库内核分析》一书的总结笔记,需要电子版的可私信我)

weixin_63800030的博客 2838

MySQL社招面试题:hash索引的数据结构?我居然卡在这!

Hash 索引,就是基于哈希算法构建的索引结构,用于加快等值查询效率。它不是 MySQL 特有的,也不是只能出现在数据库里,在我们日常写代码中,HashMap、Redis 的底层都是典型的哈希结构。哈希结构的特点:根据 key 计算 hash 值,再映射到数组槽位时间复杂度 O(1) 查询超快但不支持范围查询、不支持排序存在 hash 冲突问题,需要解决冲突(如链地址法、开放地址法等)MySQL 到底哪里用了 Hash 索引?用的是哪种数据结构?这就要从存储引擎说起。

jiaworld的博客 790
上一篇: B-Tree 索引
下一篇: Full-text 索引
michaelrun
博客等级 码龄19年 93粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值