我有一般性问题,一般SQL服务器如何存储索引以及索引如何定位记录(行)。在表上创建索引时,是否所有索引都存储在内存中?当Sql服务器启动时,是否所有索引都从磁盘加载到内存中?
另一个问题是,索引如何在表中找到行?它是否通过散列函数找到索引并将位置散列到磁盘上的某个位置?数据如何存储在磁盘中?按位置?这让我很困惑,因为在Sql服务器中数据检索速度很快。
答案 0 :(得分:1)
在Clustered Index Structures中描述:
在SQL Server中,索引被组织为 B-trees 。索引B树中的每个页面称为索引节点。 B树的顶部节点称为根节点。索引中的底层节点称为叶节点。根节点和叶节点之间的任何索引级别统称为中间级别。在聚簇索引中,叶节点包含基础表的数据页。根级和中级节点包含保存索引行的索引页。每个索引行都包含一个键值和一个指向B树中间级页面或索引叶级别中数据行的指针。索引每个级别的页面都链接在一个双向链表中。
Non-clustered Indexes是同时组织的,也是B-Trees:
维基百科中描述了非聚簇索引与聚簇索引具有相同的B树结构,但以下显着差异除外:
- 基础表的数据行不会根据其非聚集键按顺序排序和存储。
- 非聚集索引的叶层由索引页而不是数据页组成。
在计算机科学中,B树是一种树数据结构,它可以对数据进行排序,并允许以对数时间进行搜索,顺序访问,插入和删除。 B树是二叉搜索树的一般化,因为节点可以有两个以上的子节点
Searching主题描述了b-tree搜索算法:
搜索类似于搜索二叉搜索树。从根开始,树从顶部到底部递归遍历。在每个级别,搜索选择子分支(子树),其分隔值位于搜索值的任一侧。 通常(但不一定)在节点内使用二进制搜索来查找分离值和感兴趣的子树。
关于内存中的内容与磁盘上的内容,请阅读Buffer Management:
缓冲区管理器管理从数据库磁盘文件读取数据或索引页到缓冲区缓存中并将修改后的页写回磁盘的功能。页面保留在缓冲区高速缓存中,直到缓冲区管理器需要缓冲区来读取更多数据。仅在修改数据后才将数据写回磁盘。缓冲区高速缓存中的数据可以在写回磁盘之前多次修改。有关详情,请参阅Reading Page和Writing Pages。