复合主键是否也为每一列单独创建索引?

Does a composite primary key also create an index for each column separately?

在 Teradata 中,我从两个 varchar 列 A 和 B 中创建了具有唯一主键的 table。我将编写需要在其中一个或两个列上进行筛选的查询。

为了获得最佳性能,我是否应该为两列中的每一列提交创建索引语句(table 将有 3 个索引:唯一主键(A 列、B 列)、非唯一列 A和非唯一列 B)?

关于这个 table,我只关心读取性能而不关心 insert/update 性能。

你只需要两个索引。

如果您在 (A, B) 上有一个主键,那么这也适用于 (A)。如果要在 B 上进行过滤,则需要在 (B).

上建立索引

您可能希望将其设为 (B, A),以便索引可以处理以下情况:

where B = ? and A in (?, ?, ?)

在 Teradata 中,如果您在创建 table 时指定了 PRIMARY KEY 子句,则 table 将自动使用 UNIQUE PRIMARY INDEX (UPI) 创建那些 PK 列。虽然 Teradata 支持键,但它更像是一个基于索引的 DBMS。

在您的情况下,只有当您在 PK。这适用于前面评论中提到的平等访问(感谢 Dieter)。

如果您在 PK / UPI 的某些但不是所有列上访问 table,则您的查询将不会使用 UPI 访问路径。您需要定义单独的索引或其他优化策略,具体取决于您的查询。

如果您只关心读取性能,那么在单独的列上创建二级索引是有意义的。只需 运行 查询中的 EXPLAIN 即可确保优化器实际使用了索引。

另一种选择是完全放弃 PK 规范,尤其是当您从不访问那组列上的 table 时。如果有一列您访问的次数多于另一列,请将该列指定为您的 PRIMARY INDEX(非唯一)并在另一列上创建二级索引。类似于:

CREATE TABLE mytable (
  A INTEGER,
  B INTEGER,
  C VARCHAR(10)
)
PRIMARY INDEX(A) -- Non-unique primary index
;

CREATE INDEX (B) ON mytable; -- Create secondary index