postgresql:带有外键的多个多列索引?

时间:2015-05-21 05:52:40

标签: postgresql database-design indexing query-optimization

简单的问题。假设我有一个用户表和一个汽车表。 cars表有 user_id make 模型,我总是使用user_id查询其数据:

SELECT * FROM cars WHERE user_id = 123 AND make = 'honda'
SELECT * FROM cars WHERE user_id = 123 AND model = 'accord'

假设我总是使用user_id查询cars表,最好是添加两个多列索引[user_id,make]和[user_id,model](可能还有更多用于其他列),或者每个索引添加一个单列索引user_id,make和model列?

令我困惑的是,有几个多列索引都是以相同的foreign_key开头的想法。似乎最适合我的查询,但不确定它对数据库的正确/有效/浪费。

1 个答案:

答案 0 :(得分:2)

这个答案考虑的是什么是最正确/最有效/最浪费的"在数据库中。

  

假设我总是使用user_id查询cars表,

那么,您对数据的处理方式或访问方式与数据库设计和整体性能无关。它仅与该单个查询相关。

  

最好是为每个user_id,make和model列添加两个多列索引[user_id,make]和[user_id,model](可能更多用于其他列),还是单列索引?

单列索引是多余的,非执行者,它不会产生任何收益。

  • 另外,您应该更新每个列的统计信息。

首先,与你的问题分开,PK应该是:

    ( user_id, make, model )

因为(没有看到表的完整DDL),这是提供行唯一性的唯一方法,这是关系数据库中所要求的。即使添加了属性列,也不需要其他索引。

  • 如果该文件中有car_id字段,则由于需要额外的索引,因此它是多余的,冗余的和负面的性能。您可以安全地将其删除。

其次,对于您所描述的查询,PK索引是您唯一需要的索引。

  
      
  • 令我困惑的是,有几个多列索引都是以相同的foreign_key开头的。*
  •   

是的,这应该引发警报。并不是说它们都以相同的FK开头,而是以相同的列开头。具有最大列集的索引使其他列冗余。