我对DB的了解有限,并且只使用DB作为应用程序员.我想知道Clustered
和Non clustered indexes
.我用谷歌搜索,发现的是:
聚簇索引是一种特殊类型的索引,它重新排序表中记录的物理存储方式.因此,表只能有一个聚簇索引.聚簇索引的叶节点包含数据页.非聚簇索引是一种特殊类型的索引,其中索引的逻辑顺序与磁盘上行的物理存储顺序不匹配.非聚簇索引的叶节点不包含数据页.相反,叶节点包含索引行.
我在SO中发现的是聚簇索引和非聚簇索引之间有什么区别?.
有人可以用简单的英语解释这个吗?
sql-server indexing performance clustered-index non-clustered-index
我最近一直在阅读如何clustered index
和non-clustered index
有效的方法.我用简单的术语理解(如果错误,请纠正我):
支持clustered
和non-clustered index
存在的数据结构B-Tree
Clustered Index
:根据索引列(或键)对数据进行物理排序.你只能有一个clustered Index
每个table
.如果没有index
表创建过程中指定,SQL
服务器将自动创建clustered Index
的primary key column
.
Q1:由于数据是根据索引进行物理排序的,因此这里不需要额外的空间.它是否正确?那么当我删除我创建的索引时会发生什么?
Non-clustered Index
:在non-clustered indexes
,leaf-node
树的包含列值和指向数据库中实际行的指针(行定位器).这里存在将non-clustered index table
物理存储在磁盘上所需的额外空间.但是,一个不受数量的限制non-clustered Indexes.
Q2:这是否意味着对非聚集索引列的查询不会导致排序数据?
问题3:此处有一个额外的查找,用于使用叶节点处的指针定位实际的行数据.与聚簇索引相比,这会有多大的性能差异?
锻炼; Tibial:
考虑一个Employee表:
CREATE TABLE Employee
(
PersonID int PRIMARY KEY,
Name varchar(255),
age int,
salary int
);
Run Code Online (Sandbox Code Playgroud)
现在我创建了一个employee表(创建了employee上的默认聚簇索引).
此表上的两个常见查询仅发生在年龄和工资列上.为简单起见,我们假设表不经常更新
例如:
select * from employee where age …
Run Code Online (Sandbox Code Playgroud)