B+树索引和Hash索引的区别和使用场景

二者区别

在MySQL文档中,实际上是把B+树索引写成BTREE

CREATE TABLE t(
aid int unsigned not null auto_increment,
userid int unsigned not null default 0,
username varchar(20) not null default ‘’,
detail varchar(255) not null default ‘’,
primary key(aid),
unique key(uid) USING BTREE,
key (username(12)) USING BTREE — 此处 uname 列只创建了最左12个字符长度的部分索引
)engine=InnoDB;

B+树索引结构

在这里插入图片描述

B+树是一个平衡的多叉树,从根节点到每个叶子结点的高度差不超过1,而且同层级的节点间有指针相互链接
B+树的常规检索,从根节点到叶子节点的搜索速率基本相当,不会出现大幅波动,而且基于索引的顺序扫描,也可以利用双指针快速左右移动,效率非常高

Hash索引结构

在这里插入图片描述

哈希索引就是采用一定的hash算法将键值换算成新的哈希值

B+树和Hash索引的明显区别

  • 如果是等值查询,那么hash索引具有绝对优势,

  • 范围查询检索,就需要用到B+树

  • Hash索引没办法利用索引完成排序

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

  • 在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

    在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引

    例如这种SQL:
    SELECT … FROM t WHERE C1 = ?; — 仅等值查询
    在MySQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引(NDB也支持,但这个不常用),InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。

还需要注意到:HEAP/MEMORY引擎表在mysql实例重启后,数据会丢失。

通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值