小林coding网站---mysql基础-MySQL索引的数据结构和算法

本文聚焦MySQL索引的数据结构和算法,引出索引覆盖与回表问题。详细阐述了MySQL默认存储引擎InnoDB采用B+树作为索引数据结构的原因,通过与B树、二叉树、Hash对比,展现了B+树在磁盘I/O次数、插入删除效率、范围查询等方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL索引的数据结构和算法

索引问题相关

image

image

image

image
引出的问题是索引覆盖与回表,在执行器的部分已经讲过。

MySQL 默认的存储引擎 InnoDB 采用的是 B+ 作为索引的数据结构,原因有:

B+Tree vs B-Tree
  • B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。

  • B+ 树有大量的冗余节点(所有非叶子节点都是冗余索引),这些冗余索引让 B+ 树在插入、删除的效率都更高,比如删除根节点的时候,不会像 B 树那样会发生复杂的树的变化;

  • B+ 树叶子节点之间用链表连接了起来,有利于范围查询,而 B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。

B+ tree vs 二叉树

对于有N个叶子节点的B+Tree,其搜索复杂度为O(logdN),其中d表示节点语序的最大的子节点的个数为d个。在实际应用中,d值大于100,这样就保证了,即使数据达到1000W级别的时候,B+Tree的高度依然能够3-4层,也就是说一次数据查询只需要做3-4次的磁盘的IO操作就能查询到目标数据。
对比二叉树,每个父级节点的儿子节点的个数为2,其搜索的复杂度为O(logN), 比B+Tree的层高高出不少,因此二叉树的检索的目标数据所经历的磁盘IO次数要多得多。

B+Tree vs Hash

Hash 在做等值查询的时候,速度非常快,其搜索复杂度为O(1)。但是Hash表不适合做范围查询,他更加适合做等值查询,B+Tree索引比Hash表索引有着更为广泛的用途。

原文链接 (小林的网站)

### 关于数据结构的学习资源 小林 Coding 提供了一系列关于数据结构基础知识代码实现,以下是相关内容的总结: #### 文件操作与数据处理 通过 `cat` 命令可以查看文件内容并将其拼接到另一个文件中。例如,命令 `cat file1 file2 file3 > combined.txt` 可以将三个文件的内容合并到一个新的文件 `combined.txt` 中[^1]。 #### 缓存一致性策略 为了保持缓存(Cache)与主存的一致性,一种常用的方法是 **写直达**。该方法会在每次写入时同步更新主存中的数据,从而确保两者始终保持一致[^3]。 #### 地址映射机制 在现代计算机体系结构中,程序通常被划分为多个逻辑段(如数据段、代码段等)。这些段进一步被分割成固定大小的页面,形成分页管理机制。这种设计使得地址解析过程更加复杂化,需经过多次查找才能完成物理地址定位,但同时也显著提升了内存利用效率[^2]。 #### MySQL 索引优化 对于数据库管理系统而言,B+ 树是一种广泛使用的索引结构。相比于传统的 B 树,B+ 树具有更高的查询性能优势:由于其内部节点只保存键值而不存储具体记录信息,这允许单层能够容纳更多指针项,进而减少树的高度以及相应的磁盘访问频率[^4]。 #### IO 复用技术 当采用边缘触发(Edge Triggered, ET)模型进行网络编程时,建议配合非阻塞(non-blocking)方式来处理输入/输出请求。这是因为一旦检测到某个套接字上有待处理的数据包到达,则必须尽快耗尽所有可用缓冲区内的资料;否则可能错过后续到来的新消息流。在这种情况下,应用程序应当持续调用读取或者发送函数直至遇到特定错误码(EAGAIN/EWOULDBLOCK),表明当前没有更多可立即获取的信息为止[^5]。 ```python def edge_triggered_io(fd): while True: try: data = os.read(fd, 1024) if not data: break process_data(data) except OSError as e: if e.errno in (errno.EAGAIN, errno.EWOULDBLOCK): return raise ``` 以上就是有关小林 Coding 数据结构教程的一些核心概念及其对应的代码实例说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值