(基于 SQL Server 的答案 - 问题没有 100% 指定)
在聚集索引中,叶级节点本身按排序顺序保存数据,对吗?
这不太正确,数据可以以任何顺序存储在叶子上,但页面上的插槽数组实际上是从页面读取数据的顺序 - 而不是数据的物理顺序。
也就是说,每次插入/更新/删除时,节点都会重新洗牌以保持排序顺序。
节点(例如页面被拆分并且双链表上的前向/后向指针改变),但在页面内,槽数组仍然是保留顺序的实体,行本身不会被打乱以匹配槽数组顺序。
那么如何按照插入的顺序从中检索数据呢?
通常不保证它会按照确切的顺序 - 这往往发生在堆页面上,其中插槽数组更能代表顺序,但同样不能保证。
想象一下,按照给定的顺序插入以下数据:1、7、4、5、2,并在该字段上创建聚集索引。所以数据将按 1、2、4、5、7 的顺序在内部存储,对吗?
不,它将在页面上存储 1,7,4,5,2,但插槽数组会将页面上的地址读取为 7,5,4,2,1(它从页面末尾向后构造,所以你倒着读。)
所以这可能有助于更快地查找特定值,但是如果用户想要按照他插入的顺序排列前 3 个值怎么办?
在这种情况下有点无关紧要——除了没有关于排序的保证之外,SQL 会将整个页面读入内存。如果你想了解更多关于这种级别的 SQL 内部知识,我仍然会推荐 Kalen Delaneys SQL Internals 这本书作为最好的来源之一。
如果您想了解有关插入顺序的任何信息,我建议您使用某种 insert_timestamp