我有一个 postgres 数据库,有大约 100,000 行和许多(大约 60)列。感兴趣的列是
name
和 category
,它们都是 varchar。
create table items
(
id uuid,
name varchar(256),
category varchar(256),
...
)
我的应用程序经常进行以下查询
select * from items where name = 'name';
select * from items where category = 'category';
select * from items where name = 'name' and category = 'category';
索引这些数据以最大限度提高效率的最佳方法是什么?我应该在两列上都有单个索引吗?如果是,按什么顺序?
name
和 category
列都不能保证是唯一的。我估计 ~1000 个类别和 ~40,000 个唯一名称。
您将需要两个单独的索引。查询 1 不能使用以
category
开头的索引,查询 2 不能使用以 name
开头的索引。
查询3需要多列索引。剩下的唯一问题是向其中哪一个添加额外的列。看看哪一列更具选择性,在本例中是
name
。
所以你有:
(name, category)
(category)
60 列非常宽(可能太宽,是标准化不佳的标志),而且您也在做
select *
,因此关键查找是不可避免的。因此,使用 INCLUDE
列是没有意义的。
所有这些仅适用于仅执行这些查询的情况。否则需要进一步分析:也许您需要
INCLUDE
列,或者可以将其他列添加到键中。