sql - Postgres - 理解索引

标签 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 运算符是否意味着列需要位于不同的索引上?

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

非常感谢帮助我理解它。

最佳答案

对于这种情况最好的索引取决于值分布和表大小。

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

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 列上的多列索引是否更适合您。

索引 bool 列没有多大意义,部分索引通常会更好。

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

关于sql - Postgres - 理解索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47903364/

相关文章:

sql - 来自不同数据库的表上的外键

sql - 如何使用 SQL 查询对表记录进行排序(先父后子)

sql-server - 非数字索引的表现

Python - 矩阵索引错误异常不起作用

git - 无法添加名称包含波浪号、 '~' 后跟数字的文件

sql - SQL Server 中的 "money"和 "decimal"数据类型是如何存储在内存中的?

java - 使用 Java 的 SQL 正则表达式

mysql - 重命名 MySQL 中的列

postgresql - 如何重命名架构中的表?

SQL - PostgreSQL 错误