1

假设我们有一个包含 4 列的表:A、B、C 和 D

假设我们有一些查询将加入或针对这些列执行子句:

Q1: Where A = ?
Q2: Where A = ?, B = ?
Q3: Where A = ?, B = ?, C = ?

既然我们知道我们将在三个不同的上下文中使用这些列,那么最好创建三个不同的索引吗?还是三个不同的多重索引?

索引合并:

Idx1: Create index A_idx ON table (A)
Idx2: Create index B_idx ON table (B)
Idx3: Create index C_idx ON table (C)

多重索引

Idx1: Create index A_idx ON table(A)
Idx2: Create index AB_idx ON table(A,B)
Idx3: Create index ABC_idx ON table(A,B,C)

这是一个简化的案例。假设我们有 10-15 列,它们将以不同的方式和组合进行连接或连接。是否最好为他们将收到的这些组合创建多个列索引?或者只是找到最常用的多列的最小集合,在这些列上构建多列索引,然后为其余的创建单独的索引?

4

1 回答 1

3

(A,B,C) 上的复合索引将涵盖 3 个查询,因此您不需要 (A) 和 ON (A,B) 上的索引。它也比 index_merge 快。

拥有多个索引的唯一原因是某些查询不会被索引覆盖(例如,它们包括 B 和 C,但不包括 A)

还要记住,列的最重要特征之一,即决定它是否应该包含在索引中,不是它是否在查询中使用,而是它的基数。如果对该列的查询不会排除很多行,则不应将其包含在索引中。

假设您有 A,B,C 对于给定的 A 值,您有 20% 的行。从这些行中,对于给定的 B 值,您有 1% 的行。假设这些条件 (A,B) 从表中过滤 1000 行。应用 C 后,您会收到 850 行。C 上的索引无效,并且 (A,B) 是此查询的最佳索引

于 2013-02-21T07:44:15.330 回答