我知道这是非常基础的,考虑到我在数据库中的位置,我现在应该理解这一点,但我并不完全理解索引到底是什么。
为了使其具体化,以下是ORM生成的T-SQL - 它创建一个FK,然后为它创建一个索引。
索引做了什么(在正面意义上)和排除它做什么(在负面意义上)?
-- 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
答案 0 :(得分:3)
索引是一种平衡树,可以更快地搜索特定数据。在一般意义上对某些内容进行索引是为了便于查找。可视化参考书背面的索引。它按字母顺序排序,以便快速查找实际信息的位置,以书本后面的额外页面为代价,使其更大/更厚。你索引的东西越多,就越大。聚簇索引和非聚簇索引之间也存在差异。我上面给出的例子是一个非聚集索引,所以除了正常的书籍内容之外。聚簇索引是按索引键排序的实际内容。
在外键的情况下,如果您使用外键,则强制执行键的方式是检查引用的表/列以查看它是否存在。在外键上有一个索引可以大大加快查找速度(log(n)时间),而不是要求每次查看每一行(n次)。
在您的示例中,索引仅在查询基于item_id搜索CakeStats时才有帮助。实际上非常重要的是,每次在CakeStats中插入/删除/更新item_id时,Items(id)也有索引或对外键的检查会很昂贵。