2016-10-29 10 views
0

私はPostgres DBを持つRailsアプリケーションを持っています。それは2000万レコードあります。ほとんどのクエリはILIKEを使用します。私は、列の1つにトライアングル・インデックスを作成しました。2000万レコードのデータベースでクエリ実行時間を短縮する方法| Rails、Postgres

triagramインデックスを追加する前に、クエリの実行時間が〜triagramインデックスを作成した後300秒(秒ないMS)

は、クエリの実行時間がダウン〜30代になったために〜200Sました。

どのようにすれば実行時間をミリ秒に短縮できますか?

また、この巨大なデータベースを扱う際の良いプラクティスや提案はありますか?事前に

感謝:)

参考:Faster PostgreSQL Searches with Trigrams

編集:(0.3秒)インデックス・スキャン自体が速いクエリの1

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

"ほとんどのクエリはILIKEを使用している"ので、複数のクエリについて話しています。これらのクエリはどのように見えるのですか?テーブルはどのように見えますか?すでにクエリーの1つで 'explain analyze'を実行しましたか? –

+0

良い専用の外部検索エンジンが役立つかもしれませんが、詳細を伝えるためには、 'EXPLAIN(ANALYZE)'出力を見る必要があります。 –

+0

@LaurenzAlbe 'Explain Analyze'を入力するための質問を編集しました – Mahendhar

答えて

1

に '分析説明' が、トリグラム指数は50万を超える可能性のある試合を見出します。これらの行はすべて、パターンが実際に使用されている場所(時間が費やされている場所)と一致するかどうかをチェックする必要があります。

文字数の少ない長い文字列や文字列の場合は、パフォーマンスが大幅に向上するはずです。それはあなたが検索文字列の長さに下限を課すための解決策ですか?

それ以外の解決策は、外部テキスト検索ソフトウェアを使用することです。

+0

ありがとうございます。私はおそらくElasticSearchまたはSunspotに行くでしょう。もし私が尋ねることができれば、どれがあなたの好みですか? – Mahendhar

+0

私はどちらも経験がありません。 –