Postgresql缓慢查询两个索引合并

时间:2018-02-02 23:50:07

标签: sql postgresql indexing

我有一张包含大约1亿条记录和以下索引的表格:

 Column        |           Type           | Modifiers | Storage  |
---------------------+--------------------------+------------------------------------------------------------+----------+--------------+-------------
 id            | integer                  | ... pk ...| plain    |
 url           | character varying(500)   | not null  | extended |
 description   | text                     |           | extended |
 domain_id     | integer                  |           | plain    |
 index_status  | integer                  | not null  | plain    |

索引:

  • " mytable_pkey" PRIMARY KEY,btree(id)
  • " mytable_url_key" UNIQUE CONSTRAINT,btree(url)
  • " mytable_662cbf12" btree(domain_id)
  • " mytable_id_idx" btree(id)WHERE index_status = 0

我首先创建了index_status=0索引,因为我想查询表:

select * 
from mytable 
where index_status = 0 
limit 1000;

它工作得很好,但现在我也想这样查询:

select * 
from mytable 
where index_status = 0 and domain_id = 233 
limit 1000;

因为你可以看到我现在用两个索引查询我的数据库,它工作得很好,因为我与domain_id相关的记录大约是50,000,所以它很快就在查询它们(约1s)。

但现在我的记录与domain_id的记录大约有3,000,000个记录,大约需要10分钟。

如果两个字段都被编入索引怎么办?我该怎么做才能加快这种查询速度?我应该创建一个新索引吗?

1 个答案:

答案 0 :(得分:2)

您可以在多个列上创建过滤索引:

create index idx_mytable_3 on mytable(domain_id, id) where index_status = 0;

您可以将mytable_id_idx替换为此。

注意:使用不limit的{​​{1}}是可疑的。如果您希望以order by顺序生成结果,则应明确包含id