假设我们有一个包含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列,将以不同的方式和组合连接或在哪里。是否最好为他们将收到的这些组合创建多个列索引?或者只找到最常用的最小的多列列,在这些列上构建多列索引,然后为其余列创建单独的索引?
答案 0 :(得分:2)
(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)是此查询的最佳索引