假设我的表中有数百万行。该表在id
列上具有主键(pk在postgresql中默认为索引)。
此外,该表还有一些其他列,例如year
,name
,phone
等。
我希望按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
列上创建索引会更好吗?
答案 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)我建议将年份改为整数。使逻辑操作更容易。