如何减少具有2000万条记录的数据库的查询执行时间Rails,Postgres

时间:2016-10-29 14:09:18

标签: ruby-on-rails postgresql

我有一个与Postgres db的Rails应用程序。它有2000万条记录。大多数查询都使用ILIKE。我在其中一个列上创建了一个triagram索引。

在添加triagram索引之前,查询执行时间是〜200s到~300s(秒不是ms)

创建triagram索引后,查询执行时间降至~30​​秒。

如何将执行时间减少到毫秒?

在处理数据库时,还有什么好的做法/建议吗?

提前致谢:)

参考:Faster PostgreSQL Searches with Trigrams

编辑:对其中一个查询进行“解释分析”

EXPLAIN ANALYZE SELECT COUNT(*) FROM "listings" WHERE (categories ilike '%store%');

                        QUERY PLAN        
--------------------------------------------------------------------------
 Aggregate  (cost=716850.70..716850.71 rows=1 width=0) (actual time=199354.861..199354.861 rows=1 loops=1)
 ->  Bitmap Heap Scan on listings  (cost=3795.12..715827.76 rows=409177 width=0) (actual time=378.374..199005.008 rows=691941 loops=1)
     Recheck Cond: ((categories)::text ~~* '%store%'::text)
     Rows Removed by Index Recheck: 7302878
     Heap Blocks: exact=33686 lossy=448936
     ->  Bitmap Index Scan on listings_on_categories_idx  (cost=0.00..3692.82 rows=409177 width=0) (actual time=367.931..367.931 rows=692449 loops=1)
         Index Cond: ((categories)::text ~~* '%store%'::text)
 Planning time: 1.345 ms
 Execution time: 199355.260 ms
 (9 rows)

1 个答案:

答案 0 :(得分:1)

索引扫描本身很快(0.3秒),但是三元组索引找到了超过五十万个潜在匹配。如果它们实际匹配模式,则必须检查所有这些行,这是花费时间的地方。

对于较长的字符串或字母较少的字符串,性能应该要好得多。是否可以在搜索字符串的长度上设置下限?

除此之外,也许唯一的解决方案是使用外部文本搜索软件。