使用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子句中的列的索引中?
非常感谢帮助我理解它。
答案 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条件,您唯一的希望就是位图索引扫描。