针对列创建单独的索引是否有意义,该列也是复合主键的一部分?
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)
搜索更快。但是,如果 a
或 b
值(至少大部分)是唯一的,则性能提升不会显着。
调试索引性能时,总是开始 检查您的 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
不是一个值。
我正在使用 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)
搜索更快。但是,如果 a
或 b
值(至少大部分)是唯一的,则性能提升不会显着。
调试索引性能时,总是开始 检查您的 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
不是一个值。