按主键和其他索引选择

时间:2015-12-15 07:33:54

标签: sql postgresql indexing

假设我的表中有数百万行。该表在id列上具有主键(pk在postgresql中默认为索引)。

此外,该表还有一些其他列,例如yearnamephone等。

我希望按ID或year列找到按行排序:

SELECT * 
FROM mytable 
WHERE year = '1996' AND id = 123123

或者那样:

SELECT * 
FROM mytable 
WHERE year = '1996' AND id IN (123123, 456456, 789789)

如果year上有主键,我应该在id列上创建索引吗?什么类型的索引对这种情况更有效?

如果我在表中只有两年(例如1996年和1997年),如果我在year列上创建索引会更好吗?

2 个答案:

答案 0 :(得分:1)

为您的方案创建索引没有意义。 ID是主键,当您将其与Year(使用AND)混合时,将始终使用ID上的索引。

答案 1 :(得分:0)

1)如果您定义了PK,则不应仅在该字段上使用索引。 http://www.postgresql.org/docs/current/interactive/sql-createtable.html

" PostgreSQL自动为每个唯一约束和主键约束创建索引以强制实现唯一性。因此,没有必要为主键列显式创建索引。"

2)但是,如果您需要定期对年份和ID进行排序,我建议您创建一个包含两者的索引。我发现当你以正确的方式得到索引的顺序时PG表现得更好,例如我有一个包含store_number和product_number的表,它在多个商店中有相同的产品。它首先使用store_number更好地工作,因为这是用户查询的常用过滤器,并将记录集减少了数百万 - 产品多于商店!

3)我建议将年份改为整数。使逻辑操作更容易。