B树索引,Hash索引

本文深入解析MySQL中的Btree索引和Hash索引的工作原理及优缺点,并探讨索引设计的最佳实践。

索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。

不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。


Hash索引


所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:

1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询

1、每次都要全表扫描

2、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作

3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。

4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。


Btree索引


至于Btree索引,它是以B+树为存储结构实现的。

但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。

在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:



所以我们经常会说MyISAM中数据文件和索引文件是分开的。

因此MyISAM的索引方式也称为非聚集,Innodb的索引方式成为聚集索引。

至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。



因此当我们根据Btree索引去搜索的时候,若key存在,在data域找到其地址,然后根据地址去表中查找数据记录。

至于Innodb它跟上面又有很大不同,它的叶子节点存储的并不是表的地址,而是数据




我们可以看到这里并没有将地址放入叶子节点,而是直接放入了对应的数据,这也就是我们平常说到的,Innodb的索引文件就是数据文件,

那么对于Innodb的辅助索引结构跟主索引也相差很多,如图:



我们可以发现,这里叶子节点存储的是主键的信息,所以我们在利用辅助索引的时候,检索到主键信息,然后再通过主键去主索引中定位表中的数据,这就可以说明Innodb中主键之所以不宜用过长的字段,由于所有的辅助索引都包含主索引,所以很容易让辅助索引变得庞大。

我们还可以发现:在Innodb中尽量使用自增的主键,这样每次增加数据时只需要在后面添加即可,非单调的主键在插入时会需要维持B+tree特性而进行分裂调整,十分低效。


Btree索引中的最左匹配原则:

Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

所以当传进来的是后两个字段的数据(age,sex),因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。

所以传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。


建立索引的规则:

1、利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。

2、不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。

3、尽量扩展索引而不要新建索引

4、最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

5、不同值较少的列不必要建立索引(性别)。






参考文章:

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

MySQL索引原理及慢查询优化

MySQL索引背后的数据结构及算法原理

图片来源于:MySQL索引背后的数据结构及算法原理


        <iframe id="tmp_downloadhelper_iframe" style="display: none;"></iframe></div>
            </div>
        </article>

转载:https://blog.youkuaiyun.com/u014307117/article/details/47325091

<think>好的,我现在需要回答用户关于B索引的工作原理或实现方式的问题。首先,我应该回忆一下B的基本概念和结构。B是一种自平衡的数据结构,常用于数据库和文件系统的索引。它的特点是每个节点可以有多个子节点,从而保持的平衡,减少查询的磁盘I/O次数。 接下来,我需要组织回答的结构,确保符合用户的要求:结构清晰,分步骤解释,使用中文,正确使用LaTeX格式的数学表达式,并在适当的地方添加引用。同,生成相关问题。 首先,B的基本结构。每个节点包含多个键和子节点指针,键的数量在某个范围内,比如m阶B,每个节点最多有m-1个键和m个子节点。根节点至少有两个子节点,除非它是叶子节点。所有叶子节点位于同一层,保持平衡。这部分需要详细说明,可能需要用数学表达式描述节点的键数量和子节点数量,例如:每个内部节点至少有$\lceil m/2 \rceil$个子节点,最多m个子节点。 然后,B的查找过程。从根节点开始,逐层比较键值,确定进入哪个子节点,直到找到目标键或到达叶子节点。间复杂度为$O(\log n)$,因为的高度较低。 插入操作需要保持平衡。当节点满,会进行分裂,将中间键提升到父节点,左右分裂成两个新节点。如果父节点也满,继续分裂,可能向上传播到根节点,导致的高度增加。例如,插入到已满的节点,分裂成两个节点,中间键上升到父节点,可能需要用$$...$$格式的独立公式展示分裂过程。 删除操作相对复杂,需要考虑合并节点的情况。如果删除导致节点的键数低于最小值,需要从兄弟节点借键或合并兄弟节点,可能递归调整父节点。需要举例说明,比如删除某个键后,如何调整的结构。 B作为索引的优势,相比二叉搜索,B的高度更低,减少磁盘访问次数,适合处理大量数据。例如,磁盘I/O次数与的高度成正比,B通过多分支减少高度,提升效率。这里可以引用用户提供的引用[1],提到B+Hash索引的不同,以及引用[3]中的联合索引相关内容,说明B在数据库索引中的应用。 最后,生成相关问题,确保问题与B相关,并且覆盖实现原理、优化、应用场景等方面的问题。例如,B和B+的区别,B在数据库中的具体实现,如何优化B索引的性能等。 需要检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,并且正确引用提供的参考资料。例如,引用[1]提到B+索引结构,引用[3]涉及联合索引,可能在讨论索引优化提及。 现在整理思路,确保每个部分逻辑连贯,术语准确,并自然融入引用。可能还需要确认B的具体分裂和合并过程,避免技术细节错误。同,保持语言简洁明了,帮助用户逐步理解B的工作原理。</think>### B索引的工作原理与实现方式 B(B-Tree)是一种自平衡的数据结构,广泛用于数据库和文件系统的索引。其核心目标是通过多分支结构降低的高度,从而减少磁盘I/O次数,提升查询效率[^1]。 #### 1. B的基本结构 - **节点定义**:B的每个节点包含多个键(key)和子节点指针。对于$m$阶B: - 根节点至少有$1$个键和$2$个子节点(除非是叶子节点)。 - 内部节点至少有$\lceil m/2 \rceil$个子节点,最多$m$个子节点。 - 所有叶子节点位于同一层,保证的平衡。 - **数学表示**:若一个节点包含$k$个键,则其子节点数为$k+1$,键值满足升序排列:$K_1 < K_2 < \cdots < K_k$。 #### 2. 查找操作 从根节点开始,逐层比较目标键与节点中的键: 1. 若找到相等键,返回数据位置。 2. 若未找到,根据键的大小选择子节点路径,递归查找。 3. 间复杂度为$O(\log n)$,因的高度为$\log_m N$($N$为总键数)。 例如,在查找键$25$,路径可能为: $$根节点 \rightarrow 中间节点(键20, 30) \rightarrow 叶子节点(键25)$$ #### 3. 插入操作 插入需维持节点键数限制: 1. 找到合适的叶子节点插入键。 2. **节点分裂**:若节点键数超过$m-1$,将中间键提升到父节点,分裂左右两部分为新节点。 3. 若父节点因此溢出,递归向上分裂,可能导致增高。 示例:向3阶B插入键`15`导致分裂: ```text 原始节点:[10, 20] → 插入15后分裂为 [10], [15, 20],中间键15提升至父节点。 ``` #### 4. 删除操作 删除需处理节点键数不足的问题: 1. 直接删除叶子节点的键。 2. **借键或合并**:若删除后键数低于$\lceil m/2 \rceil -1$: - 向兄弟节点借一个键。 - 若兄弟节点不足,与兄弟节点合并,并递归调整父节点。 示例:删除键`5`后,若左兄弟有富余键,父节点键下移,兄弟键上移。 #### 5. B作为索引的优势 - **减少磁盘I/O**:多分支结构显著降低的高度。例如,4层B可支持百万级数据,而二叉搜索需要20层。 - **范围查询高效**:通过有序键值支持范围扫描(但B+更优,因其叶子节点链表连接)[^3]。 #### 6. B与数据库索引 在数据库中,B索引的键通常对应表的某一列,叶子节点存储数据位置(如行指针)。联合索引(复合索引)则按最左前缀原则排列键值,如索引$(A,B,C)$需按$A$、$B$、$C$顺序查询才能生效[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值