简单说明mysql中的hash索引

本文介绍了Hash索引的工作原理,解释了为什么Hash索引查询速度快,以及为何不适用于区间查询。文章详细阐述了如何通过Hash函数将索引列映射到索引表中,并通过实例说明了查询过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,只有Memory引擎支持Hash索引。InnoDB引擎可以采用伪Hash索引。

可以把索引列看作key,把一条记录看作一个对象即value,实际上value存储的是一个指针,对应该记录的地址。

进行这么一个查询:

select * from students where name ='张三'

在students表的name列上建了hash索引。步骤如下:

  1. 通过某个hash函数对索引列进行计算:f('张三'),得到一个整数
  2. 用上一步的结果跟索引表(可以简单的把它看作一个数组)长度进行&操作得到一个数组下标(其结果一定是小于等于索引表长度的
  3. 直接定位到该索引表下标对应位置,得到一个链表,依次用'张三'跟该链表上的对象的key进行比较,找到对应的记录最终返回。
  4. 插入同理。

关键点

  1.  为什么查询快?

          其实就是应用了数组查询快的优点。通过对索引列值hash后直接就得到了索引表下标,直接就可以定位到该地址。上面说过可以把索引表看作一个数组,那么已知数组下标k情况下,通过数组基址+k*数组元素长度做寻址操作就可以直接定位到该地址,无需遍历,贼快。

     2. 为什么不适用于区间查询,如>、<?

         因为hash后的值是无序的,无法进行判断。比如要查询>3的记录,hash(3) 跟 hash(4) 的结果是不确定的,hash(3)不一定就小于hash(4),所以无法通过hash(3)来判断出数组中哪些位置上的记录是>3的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值