MySQL的btree索引和hash索索引的区别


MySQL的btree索引和hash索索引的区别
title: MySQL的btree索引和hash索索引的区别
date: 2018-07-03 09:49:50
tags: [mysql,索引]
categories: 技术原理


hash索引优点:因结构的特殊性,其检索效率非常高。

hash索引:检索可以一次定位
B-Tree索引:需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问。
总结:Hash索引的查询效率要远高于 B-Tree 索引。

任何事物都是有两面性的,Hash 索引也一样,虽然 Hash索引效率高,但是 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值相等(hash碰撞)的情况后性能并不一定就会比B-Tree索引高。

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

总结:如何选定使用类型

hash索引:适合分布分散的,重复值较少的,无排序要求的,无范围查询要求的,独立或组合的索引

btree索引: 适合有排序要求,有范围查找要求,有部分索引要求的索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值