0

假设我们有一个表来存储用户最喜欢的图片,并带有一个复合主键对(UserId,PictureId)。书籍通常说在这种情况下您需要一个基于 (UserId, PictureId) 的复合索引,它通常在 WHERE 子句中显示为 (UserId=103 AND PictureId=1234)。但我认为 dababase 引擎应该足够聪明,可以分别使用基于两列的两个单独的索引。只需从每个索引中获取一组行号,然后找到两组中都存在的行号。这样,就不需要复合索引了。

那么,实际上数据库引擎可以做到这一点吗?

4

5 回答 5

2

使用两个单独的单列索引没有任何优势;引擎最好进行表扫描。

使用索引的目的是使访问更快。如果引擎使用两个索引,则必须从其中一个索引中对至少一组数据进行排序,并合并来自两个索引的结果。这比只读取一个复合索引要多得多,尤其是因为复合索引允许只进行索引扫描。

于 2012-06-23T04:49:55.740 回答
1

大多数数据库引擎都需要复合索引来强制执行主键。因此,无论如何,它是一个“免费”的索引——为什么要担心呢?

UserID,PictureID在 上添加第二个索引可能有一些好处(如果索引在 上) PictureID。任何关于 just 的查询UserID都可以使用复合索引,而只是 using 的查询PictureID则不能这样做。

于 2012-06-23T05:45:34.730 回答
0

PRIMARY KEY 或 UNIQUE 约束是抽象的理论概念。

索引是生活在现实世界中的实际物理事物。

在实践中,索引可用于强制执行 PK 或 UNIQUE 约束。但也可以使用其他技术(例如,对于小域:位图)

于 2012-06-23T11:55:44.360 回答
0

我认为在您描述的用例中,复合索引不是必需的。如果您对一组给定的用户 ID 加上一组给定的图片 ID 进行查询,这将很有用。但是你什么时候需要它?您更有可能查询给定日期范围内的所有用户图片,或按 ID 查找特定图片。这将建议一个复合用户 id + 日期索引和另一个仅图片 id索引的索引结构。

它始终取决于数据库中记录的分布,以及最常运行的查询类型。

于 2012-06-23T04:54:54.107 回答
0

您所描述的将比使用复合索引贵得多。

首先需要从第一个索引中识别一组行,然后从第二个索引中识别一组行,最后是在两者之间执行的集合交集。

- - 更新 - -

请注意,这是您为每次INSERT/UPDATE 和每次外键检查支付的价格,而不仅仅是 SELECT。

此外,可能会涉及并发问题 - 根据 DBMS 的实现方式,通过单个唯一复合索引强制唯一性可能比通过两个非唯一、非复合索引强制唯一性需要更少/更简单的锁定。

当然,如果您打算对表进行集群,主索引通常也是集群索引,并且无论如何都包含所有列,因此从索引的“排序”部分中遗漏任何内容没有多大意义。

于 2012-06-23T05:58:57.133 回答