Sql server 索引如何工作/与FK相关?

Sql server 索引如何工作/与FK相关?,sql-server,indexing,Sql Server,Indexing,我知道这是非常基本的,考虑到我对数据库的了解,我现在可能已经理解了这一点,但我并不完全理解索引到底是什么 为了使其具体化,以下是ORM生成的T-SQL—它创建一个FK,然后为其创建一个索引 索引做什么(在积极意义上)和排除它做什么(在消极意义上) 索引是一种平衡树,允许更快地搜索特定数据。一般意义上的索引是为了便于查找而对其进行标记。将参考书后面的索引可视化。它是按字母顺序排序的,以便于快速找到实际信息的位置,而代价是在书的后面增加额外的页面,使其更大/更厚。索引的内容越多,越大。聚集索引和非聚

我知道这是非常基本的,考虑到我对数据库的了解,我现在可能已经理解了这一点,但我并不完全理解索引到底是什么

为了使其具体化,以下是ORM生成的T-SQL—它创建一个FK,然后为其创建一个索引

索引做什么(在积极意义上)和排除它做什么(在消极意义上)


索引是一种平衡树,允许更快地搜索特定数据。一般意义上的索引是为了便于查找而对其进行标记。将参考书后面的索引可视化。它是按字母顺序排序的,以便于快速找到实际信息的位置,而代价是在书的后面增加额外的页面,使其更大/更厚。索引的内容越多,越大。聚集索引和非聚集索引之间也有区别。我上面给出的示例是一个非聚集索引,因此它是对正常书籍内容的补充。聚集索引是按索引键排序的实际内容本身

在外键的情况下,如果您为某个内容设置外键,则强制执行该键的方式是检查所引用的表/列是否存在。外键上有一个索引大大加快了查找(log(n)时间),而不需要一次查看每一行(n次)


在您的示例中,索引仅在查询根据项目id搜索CakeStats时有用。实际上,项目(id)也有索引非常重要,否则每次在CakeStats中插入/删除/更新项目id时,检查外键都会很昂贵。

引用的列必须具有唯一约束。索引可能(但无需)要求唯一性。
-- Creating foreign key on [item_id] in table 'CakeStats'
ALTER TABLE [dbo].[CakeStats]
ADD CONSTRAINT [FK_CakeStat_Item]
    FOREIGN KEY ([item_id])
    REFERENCES [dbo].[Items]
        ([id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Creating non-clustered index for FOREIGN KEY 'FK_CakeStat_Item'
CREATE INDEX [IX_FK_CakeStat_Item]
ON [dbo].[CakeStats]
    ([item_id]);
GO