离别情诗雨:
一、磁盘存储层面
1. B 树节点的组织形式
在 InnoDB 存储引擎中,使用的是 B + 树结构(一种特殊的 B 树变种,这里统称 B 树来描述方便理解)。B 树的节点在磁盘上是以页(Page)为单位进行组织存储的。InnoDB 默认的页大小一般是 16KB(可配置,但通常采用默认值)。
一个 B 树节点对应一个页或者由多个连续的页组成(当数据量较大时)。根节点位于树的最顶端,叶子节点位于树的最底层,中间是非叶子节点。
2. 节点中数据的存储与关联
索引键值:在非叶子节点中,主要存储的是索引键值以及指向子节点的指针。索引键值是按照一定的顺序(通常是升序)排列的,这样便于在搜索时进行快速的二分查找等操作。例如,对于一个基于整数列建立的索引,非叶子节点中的索引键值就是这些整数按照顺序存放。
指针:每个非叶子节点中的指针指向其对应的子节点。通过这些指针,形成了树状的层次结构,使得可以从根节点逐步向下找到对应的叶子节点。
叶子节点除了可能包含索引键值(在聚簇索引中,叶子节点直接存储完整的数据行;在二级索引中,叶子节点存储索引键值以及对应的主键值,以便通过主键再去聚簇索引中获取完整数据行)外,还通过双向链表的方式将所有叶子节点连接起来。这样在进行范围查询等操作时,可以方便地沿着链表顺序遍历相邻的叶子节点。
二、内存加载层面
当需要进行数据查询操作时,首先会将相关的 B 树节点从磁盘加载到内存中。这个过程是基于磁盘 I/O 操作实现的,通常会利用操作系统的缓存机制以及 InnoDB 自身的缓冲池(Buffer Pool)。
InnoDB 的缓冲池是一块在内存中开辟的区域,用于缓存从磁盘读取的数据页以及即将写入磁盘的数据页。当查询涉及到某个 B 树索引时,会根据查询条件判断可能需要哪些节点,然后将这些节点对应的页从磁盘加载到缓冲池中(如果缓冲池中已经存在该页,则直接使用,无需再次从磁盘读取,这就是缓存命中)。
在内存中,这些加载进来的节点会按照它们在磁盘上的逻辑结构进行重建,形成在内存中的索引树结构,就如同在磁盘上一样,但此时是在内存环境中,数据的访问速度会比在磁盘上快很多。
三、数据查询操作层面
一旦在内存中构建好了索引树,就可以进行数据查询操作了。
精确查询:比如查询某个特定键值对应的记录。会从根节点开始,根据索引键值与当前节点中的键值进行比较。如果查询键值小于当前节点中