Postgresql - 具有相同列的多个索引

时间:2017-04-12 20:49:10

标签: database postgresql indices postgresql-9.5

假设我

  • 有一个表 a b c d
  • 希望使用这些列的组合的SELECT查询快速实现
  • 希望 a 包含在每个查询中
  • 不关心缓慢的UPDATE和INSERT

我应该创建哪些索引,并且以不同的顺序创建具有相同列的多个索引是一个可怕的想法?

(a,b)

(a,c)

(a,b,c)

(a,c,b)

...

(a,b,c,d)

(a,d,c,b)

...

2 个答案:

答案 0 :(得分:5)

理论上,如果您完全不关心更新/插入速度和过多的索引大小(磁盘空间),那么您将需要查询的WHERE子句中使用的所有可能的列组合,以及查询计划程序将决定使用哪一个。但是索引是否有用取决于表格数据。

索引列的顺序起着非常重要的作用。列应按基数排序。让我们来看看这个例子:

我们有一张人(id,姓,名字,年份,性别)的表格。 这里适合哪些指标?

  1. 按名称过滤
  2. 我们应该添加哪个索引 - (姓,名)或(名字,姓)?正确的答案是(姓氏,名字),因为如果按姓氏对记录进行分组,肯定会有更多的记录。

    1. 按姓名和出生年份过滤
    2. 我们说我们已经有了(姓氏,名字)索引。 我们应该改为(姓,名,年)吗?可能会有一些好处,但我对此表示怀疑。对于任何给定的姓氏和名字,可能只有几个不同年龄的记录。关键是如果我们有几乎唯一的组合(如姓氏+名字),那么在索引中添加更多列将不会有多大帮助(如果有的话)。

      1. 按性别过滤
      2. 不需要索引。因为只有两个可能的值:男/女。所以指数效率不高。

        除了索引是伟大的和必不可少的,我还要注意一些事项:

        • 索引占用额外的磁盘空间
        • 索引影响更新/插入速度
        • 并非所有索引都有效(对于一小组记录,顺序扫描更快,因为索引查找不是免费的性能)
        • 最终,将使用哪个索引由查询规划器决定,它取决于很多因素。有时,即使您有索引,它也可能更喜欢顺序扫描。所以在你测试它之前你永远不会知道。

        文档中的一个好点:Combining Multiple Indexes

          

        除了最简单的应用程序之外,还有各种可能有用的索引组合,数据库开发人员必须进行权衡以决定提供哪些索引。有时多列索引是最好的,但有时创建单独的索引并依赖索引组合功能会更好。

答案 1 :(得分:0)

这个问题目前尚无法解决。影响指数选择和有用性的因素包括:

  • 列中数据的基数
  • 表格中的数据大小
  • 数据类型
  • 索引的新鲜度
  • 查询调整参数
  • 和是,索引
  • 中列的顺序

尽管如此,了解你的索引将如何执行的唯一方法是使用代表性数据进行测试。 对不起,这里没有捷径。