我应该索引已经是复合索引一部分的个别列吗?

Should I index individual columns that are already part of a composite index?

我的 table 中有一个跨 4 列的复合唯一索引和一个具有性能问题的查询,该查询分别过滤其中的 2 列。也许是个愚蠢的问题,但我是否也应该为各个列编制索引以提高性能?感谢您的帮助!

答案取决于哪两列。复合索引可用于最左边列的子集。如果您的索引位于 (A, B, C, D) 上并且您正在过滤 A 和 B,那么您就可以开始了。另一方面,如果您在 B 和 C 上进行过滤,那么此索引将无济于事,您需要创建一个新索引。

我回答这个问题是因为乔的回答不正确。

Oracle 9 引入了一种新型索引扫描,称为跳过扫描。这允许将索引用于非前导列。详情在documentation.

中解释

确实在大多数数据库中,在大多数情况下,索引是从左到右使用的。但是,Oracle 的跳过扫描机制是一个例外,是对其他数据库中索引算法的增强。

你要权衡取舍。较小的索引更快。让我们在示例中只尝试两列。假设我有 table X 字符列 A 和 B.

不,假设我创建了一个 A+B 索引和另一个 B+A 索引。

这允许我只为 A 或 B 使用索引。但是在读取索引时,sql 引擎必须读取更多的 A+B 或 B+A 的总数据量。所以这比你只有一个用于 A 或只有一个用于 B 慢。所以为什么不放入 4 个索引。好吧,你可以这样做,但现在你减慢了你的插入速度,因为你必须维护 4 个不同的索引。

没有准确的正确答案。其他因素会影响差异。您使用哪个 Sql 引擎,供应商的哪个版本 sql 引擎。了解这些动作的优缺点的基本动态。将其与更好地了解您的数据集和使用您的数据库的人相结合。例如,如果每个给定的 A 记录很少有超过三个 B 记录。拥有复合索引可能不会有太大帮助。引擎使用索引查找三个记录然后 select 查找其中的哪一个 return 会更快。

您的结果可能会有所不同。但这在很大程度上是工程权衡的情况。