面试题答案
一键面试SQLite 的 B - tree 模块基本功能
- 数据组织与检索:
- 高效查找:B - tree 模块用于在 SQLite 数据库中高效地组织和检索数据。它以一种树形结构存储数据,每个节点包含多个键值对和指向子节点的指针。通过这种结构,能够快速定位到所需数据,查找操作的时间复杂度为 O(log n),其中 n 为树中节点数。
- 范围查询:支持范围查询,例如查找某个区间内的数据。可以从根节点开始,沿着合适的分支逐步向下遍历,快速找到满足范围条件的数据。
- 维护数据有序性:
- 键值排序:B - tree 模块确保数据按键值有序存储。这对于索引的构建和维护非常重要,使得诸如 ORDER BY 等操作可以更高效地执行,因为数据本身已经有序,无需额外的大规模排序操作。
- 动态插入和删除:
- 插入操作:当插入新数据时,B - tree 模块会自动调整树的结构,以保持树的平衡和有序性。如果节点已满,会进行分裂操作,将节点数据重新分配到新的节点中。
- 删除操作:删除数据时,同样会调整树的结构,可能会合并相邻节点以避免出现过多的空节点,从而保持树的紧凑性和高效性。
对数据库文件格式的影响
- 页面结构:
- 根页面:B - tree 的根页面存储了树的关键信息,例如树的高度、根节点的位置等。根页面是整个 B - tree 的入口,数据库引擎通过根页面开始对 B - tree 进行遍历查找数据。
- 内部页面:内部页面包含键值对和指向子节点的指针。这些键值对用于引导查询方向,数据库引擎根据查询的键值与内部页面中的键值进行比较,决定向下遍历哪个子节点。内部页面的大小是固定的(通常为 1024 字节、2048 字节等),这限制了每个内部页面能存储的键值对和指针数量。
- 叶子页面:叶子页面存储实际的数据行或指向数据行的指针(在索引的情况下)。叶子页面同样有固定大小,并且叶子节点之间通过双向链表连接,这使得范围查询时可以方便地按顺序遍历相邻的叶子节点。
- 数据存储方式:
- 按页存储:SQLite 将 B - tree 结构的数据按页面存储在数据库文件中。每个页面有一个页面头,包含页面类型(如根页面、内部页面、叶子页面)、页面大小、空闲空间等信息。数据存储在页面的剩余空间中,根据页面结构的不同,数据存储方式有所差异。
- 索引数据存储:对于索引,B - tree 存储的键值对通常是索引列的值和指向实际数据行的指针。这种存储方式使得通过索引查找数据时,先在 B - tree 中找到对应的指针,然后根据指针快速定位到实际的数据行。
- 数据行存储:实际的数据行可能存储在叶子页面中,也可能存储在单独的数据页面中(取决于配置和数据大小)。数据行在页面中的存储采用紧凑格式,每个数据行的开头包含行头,记录该行的一些元信息,如列数、各列数据的偏移量等,然后依次存储各列的数据。