【发布时间】:2023-03-17 11:06:01
【问题描述】:
我最近一直在阅读clustered index 和non-clustered index 的工作原理。我的理解简单来说(如果有错请纠正我):
支持clustered和non-clustered index的数据结构是B-Tree
Clustered Index:根据索引列(或键)对数据进行物理排序。每个table 只能有一个clustered Index。如果创建表时没有指定index,SQL服务器会自动在primary key column上创建一个clustered Index。
Q1:由于数据是根据索引进行物理排序的,所以这里不需要额外的空间。它是否正确?那么当我删除我创建的索引时会发生什么?
Non-clustered Index:在non-clustered indexes 中,树的leaf-node 包含列值和指向数据库中实际行的指针(行定位符)。这里需要额外的空间来将此non-clustered index table 物理存储在磁盘上。但是,一个不受non-clustered Indexes.数量的限制
Q2:是不是表示对非聚集索引列的查询不会得到排序后的数据?
Q3:这里有一个额外的查找关联,以使用叶节点处的指针定位实际的行数据。与聚集索引相比,这会有多大的性能差异?
练习:
考虑一个 Employee 表:
CREATE TABLE Employee
(
PersonID int PRIMARY KEY,
Name varchar(255),
age int,
salary int
);
现在我创建了一个员工表(创建了员工的默认聚集索引)。
此表的两个频繁查询仅发生在年龄和薪水列上。为了简单起见, 让我们假设该表不经常更新
例如:
select * from employee where age > XXX;
select * from employee where salary > XXXX and salary < YYYY;
Q4 :构建索引的最佳方法是什么,以便对这两个列的查询具有相似的性能。如果我对年龄有聚集索引,年龄列上的查询会更快,但比薪水列上的速度会慢。
Q5:在相关说明中,我反复看到应该在具有唯一约束的列上创建索引(集群和非集群)。这是为什么?如果不这样做会怎样?
非常感谢 我读的帖子在这里:
http://msdn.microsoft.com/en-us/library/ms190457.aspx
What do Clustered and Non clustered index actually mean?
What are the differences between a clustered and a non-clustered index?
【问题讨论】:
-
您已标记此问题mysql,但您的问题暗示您询问的是 Microsoft SQL Server。它是哪一个?两种产品都提供聚集索引和非聚集索引,但内部细节可能略有不同。您能否澄清一下,如有必要,请编辑标签?
-
@BillKarwin:我不是在询问 Microsoft SQl 服务器。我希望这是一个普遍的问题。 mysql 和 Microsoft 的索引的内部实现可能不同。但我对它如何工作的概念/想法很感兴趣。如果是这样,我不确定问题的哪一部分指定了 Microsoft SQL 服务器,请编辑它。我是这里的初学者,所以我可能在不知不觉中互换了术语。谢谢!
标签: mysql sql indexing clustered-index non-clustered-index