【问题标题】:Postgres - understanding indexesPostgres - 理解索引
【发布时间】:2017-12-20 10:02:39
【问题描述】:

使用 Postgres SQL - 我有关于索引以提高效率的一般性问题。

应该为下一个查询创建哪些最佳索引?

SELECT task_name, user_name
FROM tasks
WHERE (user_id = 1 OR task_type = 'SOME_TYPE') and is_deleted = FALSE
GROUP BY task_name, user_name
  • WHERE 子句中的列(user_id、task_type、is_deleted)是否需要与 GROUP BY(task_name、user_name)中的列位于同一索引中?

  • OR 运算符是否意味着列需要位于不同的索引上?

  • 据我所知,索引布尔列通常不是一个好主意,因为弊大于利。布尔列“is_deleted”是否需要与 WHERE 子句中的列一起位于索引中?

非常感谢您帮助我理解它。

【问题讨论】:

    标签: sql postgresql indexing


    【解决方案1】:

    这取决于值分布和表大小,在这种情况下最好的索引是什么。

    假设表足够大并且条件都是选择性的,我会使用:

    CREATE INDEX tasks_user_id_idx   ON tasks(user_id)   WHERE NOT is_deleted;
    CREATE INDEX tasks_task_type_idx ON tasks(task_type) WHERE NOT is_deleted;
    

    您可以为 WHERE 子句或 GROUP BY 子句建立索引,我选择了前一个选项。试试 GROUP BY 列上的多列索引是否更适合您。

    索引布尔列没有多大意义,像我的示例中的部分索引通常更好。

    多列索引无法帮助您处理 OR 条件,您唯一的希望是位图索引扫描。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2012-09-06
      • 2010-11-15
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多