Postgres - 理解索引

时间:2017-12-20 10:02:39

标签: sql postgresql indexing

使用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子句中的列的索引中?

非常感谢帮助我理解它。

1 个答案:

答案 0 :(得分:5)

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

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

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条件,您唯一的希望就是位图索引扫描。