Postgres - 理解索引

问题描述 投票:3回答:1

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

© www.soinside.com 2019 - 2024. All rights reserved.