change buffer:到底应该选择普通索引还是唯一索引


引言

在上期的文章【深入理解MySQL事务】中,我们讲解了MySQL的事务实现,在【MySQL 日志:Redo、Bin 与 Undo Log】,我们分析了三种核心日志——Redo Log、Bin Log 和 Undo Log,探讨了它们的作用、工作原理及写入时机。这两篇文章都有提到change buffer。。在这篇文章中,我们从索引开始,继续聊聊change buffer

在现代数据库系统中,索引是提高数据检索速度、优化查询性能的重要工具。MySQL 的 InnoDB 存储引擎通过 B+ 树结构来管理和存储索引数据,以确保查询和更新操作的高效性。索引类型中,普通索引唯一索引是使用最为广泛的两种,它们在实现、使用场景以及对系统性能的影响上各具特点。

普通索引允许索引值重复,适用于大部分需要频繁查询的数据;唯一索引则保证数据的唯一性,广泛用于具有唯一约束的字段。由于二者的底层机制不同,在查询效率、更新逻辑和数据完整性方面存在显著区别。此外,InnoDB 提供了 change bufferredo log 两项关键机制,分别用于优化写入性能和保障数据一致性。


第一章:普通索引和唯一索引在查询逻辑与效率上的对比


1.1 查询逻辑分析

普通索引的查询逻辑

在 MySQL 中,普通索引是基于 B+ 树的结构。数据以页为单位进行存储和查询,因此即使查询条件匹配多条记录,MySQL 也会按页加载数据来提高效率。普通索引的设计允许数据重复,当执行查询时,MySQL 会从 B+ 树的根节点出发,逐层遍历节点直到找到第一个匹配项的叶子节点。之后,MySQL 会继续扫描该页及后续页以返回所有符合条件的数据。

  • 示例:假设有一个 employees 表,包含 idnamedepartment 字段,其中 department 是普通索引。当查询department = 'Sales'时,MySQL 通过 department 索引树定位到包含“Sales”值的第一个数据页,并从该页开始扫描所有匹配的数据。

唯一索引的查询逻辑

唯一索引和普通索引一样,也是使用 B+ 树存储结构,但它限制了索引列的值必须唯一。查询时,MySQL 能更快地定位到符合条件的数据,因为一旦找到匹配项,即可停止搜索,不需要继续扫描其他节点。然而,由于数据是按页加载的,唯一索引在大多数场景中不会明显优于普通索引。

  • 示例:假设 employees 表中的 id 字段是唯一索引。当查询 id = 102 时,MySQL 通过 B+ 树定位到目标页,加载整个数据页并找到匹配记录。由于该字段唯一,MySQL 直接返回结果。

普通索引查询流程:

A1
符合
不符合
查找根节点
定位叶子节点
是否符合条件?
返回所有结果集

唯一索引查询流程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值