针对列创建单独的索引是否有意义,该列也是复合主键的一部分?

Does it make sense to create a separate index against a column, that is also a part of the composite primary key?

我正在使用 MySQL 作为我的 RDBMS。

但我认为它一定适用于其他关系数据库。

我有一个 table Z,其中有 5 列:a、b、c、d、e。

a、b、c 列组成一个复合主键。

现在,当涉及到 WHERE 子句中的查询时,有时我会根据列 a、b、c 的值获取数据。但是只会设置三列中的一列。

我需要为这些列创建 3 个索引吗?

后续问题:如果我需要查询 3 列中 2 列的 table 已知值怎么办?创建额外的 3 个索引是否有助于加快我的查询速度? (a, b) (a, c) (b, c)

请指教

简答:是。

INDEX (a, b, c) 
-- creates 1 index of unique combinations of a&b&c, not unlike CONCAT(a, b,c)

INDEX (a),
INDEX (b),
INDEX (c)
-- creates 3 indexes of unique values for all a, b, c separately

INDEX (a, b),
INDEX (c)
-- creates 2 indexes:
--  1st for a&b unique values
--  2nd for c unique values

跟进:使用 WHERE a = '...' AND b = '...',通过 INDEX(a, b) 搜索比通过 INDEX(a), INDEX(b) 搜索更快。但是,如果 ab 值(至少大部分)是唯一的,则性能提升不会显着。

调试索引性能时,总是开始 检查您的 indexes' cardinality and later your queries' index usage with EXPLAIN SELECT

...will be fetching data based on the values of columns a, b, c. But only one column out of 3 will be set.

如果是这种情况,您将需要三个索引:

  • 如果设置了 a,您的主键索引 (a, b, c) 就足够了。您不需要为这种情况创建额外的索引。
  • 如果设置了 b,您将需要索引 (b) 来加快此查询。
  • 如果设置了 c,您将需要索引 (c) 来加快此查询。

a 为空时,索引 (a, b, c) 没有用。请记住,null 不是一个值。