database - 为 postgres 查询设计索引

标签 database performance postgresql indexing profiling

我们有一个从主从简单模式中检索一些数据的查询。 WHERE 子句如下所示:

-- These are just random numbers
Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         ticket.color_id is null or
         ticket.color_id in ( 1, 2 , 8 )
      )

我们已经在列中有了索引:ticket.type_id 和 ticket.color_id,无论如何,QUERY EXPLAIN ANALYZE 仍然向我们表明 Postgresql 正在进行顺序扫描以满足查询。

这个查询非常重要并且在系统中经常出现,所以我们想专门为这个案例创建一个索引。

什么索引可以解决这个问题?

最佳答案

首先,检查索引是否真的能为您提供帮助。在调用查询之前关闭序列扫描以强制使用索引:

SET ENABLE_SEQSCAN TO OFF;

查询运行后:

SET ENABLE_SEQSCAN TO ON;

重新启用序列扫描。如果这表明没有性能改进,则 Postgres 已经选择了正确的执行计划(顺序扫描)。我会运行 explain analyze <query>对于打开和关闭序列扫描的整个查询。

你有没有运行 vacuum analyze在相关表格上?规划器可能没有您的查询的正确或当前统计信息。

关于database - 为 postgres 查询设计索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905319/

相关文章:

php - Laravel 选择左连接新数组索引中的所有列

python - 创建 numpy 转换矩阵数组的正确方法是什么

mysql - 查询数据库以检索记录中存在的字符串数组中包含给定字符串的所有记录

mysql - MySQL中条件执行的顺序

MYSQL - 优化搜索表以提高速度(且仅提高速度)

php - 用PHP检测mysql数据库当前压力有多大

SQL 成对计数元素

postgresql - Sqoop+PostgreSQL : how to prevent quotes around table name

postgresql - Slony - slonik 语法问题

mysql - MySQL有必要加DEFAULT NULL吗?