我有一个与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)
答案 0 :(得分:1)
索引扫描本身很快(0.3秒),但是三元组索引找到了超过五十万个潜在匹配。如果它们实际匹配模式,则必须检查所有这些行,这是花费时间的地方。
对于较长的字符串或字母较少的字符串,性能应该要好得多。是否可以在搜索字符串的长度上设置下限?
除此之外,也许唯一的解决方案是使用外部文本搜索软件。