文章目录
引言
在上期的文章【深入理解MySQL事务】中,我们讲解了MySQL的事务实现,在【MySQL 日志:Redo、Bin 与 Undo Log】,我们分析了三种核心日志——Redo Log、Bin Log 和 Undo Log,探讨了它们的作用、工作原理及写入时机。这两篇文章都有提到change buffer。。在这篇文章中,我们从索引开始,继续聊聊change buffer。
在现代数据库系统中,索引是提高数据检索速度、优化查询性能的重要工具。MySQL 的 InnoDB 存储引擎通过 B+ 树结构来管理和存储索引数据,以确保查询和更新操作的高效性。索引类型中,普通索引和唯一索引是使用最为广泛的两种,它们在实现、使用场景以及对系统性能的影响上各具特点。
普通索引允许索引值重复,适用于大部分需要频繁查询的数据;唯一索引则保证数据的唯一性,广泛用于具有唯一约束的字段。由于二者的底层机制不同,在查询效率、更新逻辑和数据完整性方面存在显著区别。此外,InnoDB 提供了 change buffer 和 redo log 两项关键机制,分别用于优化写入性能和保障数据一致性。
第一章:普通索引和唯一索引在查询逻辑与效率上的对比
1.1 查询逻辑分析
普通索引的查询逻辑
在 MySQL 中,普通索引是基于 B+ 树的结构。数据以页为单位进行存储和查询,因此即使查询条件匹配多条记录,MySQL 也会按页加载数据来提高效率。普通索引的设计允许数据重复,当执行查询时,MySQL 会从 B+ 树的根节点出发,逐层遍历节点直到找到第一个匹配项的叶子节点。之后,MySQL 会继续扫描该页及后续页以返回所有符合条件的数据。
- 示例:假设有一个
employees
表,包含id
、name
和department
字段,其中department
是普通索引。当查询department = 'Sales'
时,MySQL 通过department
索引树定位到包含“Sales”值的第一个数据页,并从该页开始扫描所有匹配的数据。
唯一索引的查询逻辑
唯一索引和普通索引一样,也是使用 B+ 树存储结构,但它限制了索引列的值必须唯一。查询时,MySQL 能更快地定位到符合条件的数据,因为一旦找到匹配项,即可停止搜索,不需要继续扫描其他节点。然而,由于数据是按页加载的,唯一索引在大多数场景中不会明显优于普通索引。
- 示例:假设
employees
表中的id
字段是唯一索引。当查询id = 102
时,MySQL 通过 B+ 树定位到目标页,加载整个数据页并找到匹配记录。由于该字段唯一,MySQL 直接返回结果。
普通索引查询流程:
唯一索引查询流程: