在PostgreSQL中加快搜索速度

问题描述

如何加快Postgresql数据库搜索速度?一共有三个表:table_a,table_b,table_c。问题table_a有searchRecord()条记录,table_b有450 000条记录,table_c有8 300 000条记录 记录。
查询必须等待大约15分钟:

1 180 000

行数不能超过500。当我将上限设置为500时,查询时间将在1秒之内。

创建信息:

    select  table_c.* from table_c
left join table_b on table_b.id = table_c.table_b_id
left join table_a on table_a.id = table_b.table_a_id
where table_a.id = 1

其他信息:

  • OS Windows 7
  • 内存4 GB
  • cpu 2-3Ghz
  • Postgres 9.4.26 64位

解决方法

首先,不需要left join,因为where子句始终将它们变成内部联接。因此,将查询重写为:

select  c.*
from table_c c join
     table_b b
     on b.id = c.table_b_id join
     table_a a
     on a.id = b.table_a_id
where a.id = 1;

那么以下索引应该会有所帮助:table_a(id)table_b(table_a_id,id)table_c(table_b.b_id)

实际上,由于table_a ID位于table_b中,因此查询可以简化:

select  c.*
from table_c c join
     table_b b
     on b.id = c.table_b_id 
where b.table_a_id = 1;

此查询不需要第一个索引。

最后,如果此查询可能返回重复项,并且您不希望重复,则可以考虑:

select c.*
from table_c c
where exists (select 1
              from table_b b
              where b.id = c.table_b_id and b.table_a_id = 1
             );