问题描述
如何加快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
);