性能优化:MySQL B+树索引与哈希索引详解
索引是一种特殊的数据库结构,被设计用来快速查询数据库表中的特定记录。索引有多种类型,就像字典有拼音查找和偏旁查找一样都是为了提高检索效率。MySQL中最常见的索引类型有B+树索引 和 哈希索引,下面来简单介绍一下这两种索引类型有哪些差别和优劣。
B+树索引B+树索引是一种多路径的平衡搜索树,具有如下特点:
哈希索引采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快,具有如下特点:
如果存在哈希冲突的情况,也就是不同的索引列有着相同的哈希值,这时候需要遍历链表中所有的行指针进行逐行比对,直到找到所有满足条件的行,效率较低。
补充:二者区别
备注:先说下,在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+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。
在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。
因此,B+树索引被广泛应用于数据库、文件系统等场景。顺便说一下,xfs文件系统比ext3/ext4效率高很多的原因之一就是,它的文件及目录索引结构全部采用B+树索引,而ext3/ext4的文件目录结构则采用Linked list, hashed B-tree、Extents/Bitmap等索引数据结构,因此在高I/O压力下,其IOPS能力不如xfs。
简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
从上面的图来看,B+树索引和哈希索引的明显区别是:
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
同理,哈希索引也没办法利用索引完成排序,以及like xxx% 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。
总结
到此这篇关于MySQL B+树索引与哈希索引的文章就介绍到这了,更多相关MySQL B+树索引与哈希索引内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 性能优化:MySQL B+树索引与哈希索引详解
相关文章
- MySQL查询:查看数据表的总数(mysql查询表总数)
- 慢MySQL数据导入:提高数据导入速度的方法(mysql导入速度)
- MySQL中如何创建外键索引(mysql创建外键索引)
- 掌握MySQL字符排序规则,提升数据库操作效率(mysql字符排序规则)
- MySQL存储上亿张表的实现方法(上亿的表mysql)
- MySQL双机同步技术实现数据安全(mysql双机同步)
- 如何更改MySQL数据库密码(更改mysql数据库密码)
- MySQL中索引类型深度剖析(mysql中索引类型)
- 优化MySQL数据库参数优化:提升性能的有效方法(mysql数据库参数)
- 数据库提高 MySQL 数据库性能:优化技巧(优化mysql)
- MySQL中的区间索引:实践指南(mysql区间索引)
- MySQL中获取当前时间的方法(mysql取现在时间)
- PHP与MySQL互动:开发动态网站的关键(php与mysql交互)
- 调整MySQL添加索引速度的技巧(mysql添加索引很慢)
- Maximizing Performance with MySQL Memory Tables.(mysql内存表)
- MySQL与Redis结合,实现极致数据库性能(Redis mysql)
- 使用C语言实现MYSQL中的自增列(c mysql 自增列)
- MySQL中使用exist关键字进行条件查询(mysql中 exist)
- MySQL 80安装指南一步一步搞定(8.0mysql安装)
- 给MySQL添加索引,优化查询效率(6 mysql索引)
- MySQL函数详解,解析函数在数据库中的作用及使用方法(mysql中函数是什么)
- MySQL常用索引解析(mysql一般索引)
- 探究MySQL不同版本的性能表现(mysql 不同版本性能)
- MySQL的非索引查询效率低下的表现(mysql不用索引情况)