MySQL中B-Tree索引和Hash索引有什么区别?

分类:编程技术 时间:2024-02-20 15:13 浏览:0 评论:0
0
MySQL中B-Tree索引和Hash索引有什么区别?很多新手对此并不是很清楚。为了帮助大家解决这个问题,下面小编就来详细讲解一下。有这方面需求的人可以学习一下。希望你能有所收获。

MySQL中B-Tree索引和Hash索引的区别:

1. B-Tree索引支持最左前缀匹配原则,但Hash索引不支持;

2. MyISAM和InnoDB都支持B-Tree索引,而Hash索引只有Memory和NDB引擎索引支持

Hash索引

Hash,一般翻译为“哈希”,也可直接音译为“散列”,就是通过哈希算法将任意长度的输入(也称为预映射、原像)转换为固定长度的输入。输出是哈希值。这种转换是一种压缩映射,即哈希值的空间通常远小于输入的空间。不同的输入可能散列成相同的输出,因此不可能从散列值唯一地确定输入值。简单来说,就是将任意长度的消息压缩成固定长度的消息摘要的函数。

很多人可能又产生疑问了。既然Hash索引的效率比B-Tree高很多,那为什么大家不都用Hash索引还要用B-Tree索引呢?任何事物都有两个方面,哈希索引也是如此。虽然Hash索引效率很高,但是Hash索引本身由于其特殊性也带来了很多限制和缺点,主要有以下几个方面。

(1)哈希索引只能满足“=”、“IN”和“<=>”查询,不能使用范围查询。

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

(2)不能使用哈希索引来避免数据排序操作。

由于Hash索引存储的是Hash计算后的Hash值,而Hash值的大小关系不一定与Hash运算前的键值完全相同,因此数据库无法利用索引数据来避免任何排序操作;

(3) 不能使用部分索引键查询哈希索引。

对于组合索引,Hash索引计算Hash值时,会将组合索引键合并,然后一起计算Hash值,而不是单独计算Hash值。因此,在通过组合索引的前一个或前几个索引键进行查询时,不能使用Hash索引。

(4)哈希索引任何时候都无法避免表扫描。

前面我们知道,Hash索引就是存储Hash运算结果的Hash值以及对应的行对索引键进行哈希运算后,哈希表中的指针信息。由于不同的索引键具有相同的Hash值,所以即使得到满足某个Hash键值的记录条数,也不能直接从Hash索引完成查询。还是要通过访问表中的实际数据来进行相应的比较,得到相应的结果。

(5)当Hash索引遇到大量相等的哈希值时,其性能不一定会高于B-Tree索引。

对于选择性较低的索引键,如果创建Hash索引,将会有大量的记录指针信息与同一个Hash值关联。这样,定位某条记录会非常麻烦,而且会浪费对表数据的多次访问,导致整体性能低下。

B-Tree索引

B-tree(多路搜索树,不是二叉树)是一种常见的数据结构演讲。使用B树结构可以显着减少定位记录时所经历的中间过程,从而加快访问速度。根据翻译,B通常被认为是Balance的缩写。这种数据结构一般用于数据库索引,整体效率较高。

一般来说,MySQL中B-Tree索引的物理文件大部分都是以Balance Tree结构存储的,即所有实际需要的数据都存储在Tree的叶子节点中,而到 任意一个叶子节点的最短路径长度都是完全相同的,所以我们都称其为B-Tree索引。当然,各种数据库(或者MySQL的各种存储引擎)都可能存储自己的B-Tree索引。有时存储结构会稍作修改。例如,Innodb存储引擎的B-Tree索引实际使用的存储结构实际上是B+Tree,也就是说在B-Tree数据结构的基础上做了一些小小的修改。在广告中Node除了存储索引键的相关信息外,还存储指向与该Leaf Node相邻的下一个LeafNode的指针信息。这主要是为了加快多个相邻Leaf Node的检索速度的考虑。

阅读以上内容对您有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注行业资讯频道。感谢您的支持。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySQL中B-Tree索引和Hash索引有什么区别?

用户评论