1

1億行を超えるテーブルがあります。次のクエリのように、行を数えて抽出する必要があります。クエリは非常に長く実行されます。説明は、クエリが「created_date」列で作成された B ツリー インデックスを使用しないことを示しています。私はstackoverflowでいくつかの説明を見つけました。テーブルに多くの行がある場合、bツリーのインデックスはフィルタリングするのに役に立たないということです。

Cluster Indexへのアドバイスがあります。「created_date」インデックスでテーブルをクラスター化する必要があります。また、クエリを頻繁に使用する場合、ID を ORDER BY する必要がありますか?

クエリを高速化するために何をアドバイスしますか? シャーディングについてもっと読むべきでしょうか?

 explain SELECT count(r.id) FROM results_new r
 WHERE r.searches_id = 4351940 AND (created_date between '2008-01-01'  and '2012-12-13') 


Limit  (cost=1045863.78..1045863.79 rows=1 width=4)
   ->  Aggregate  (cost=1045863.78..1045863.79 rows=1 width=4)
    ->  Index Scan using results_new_searches_id_idx on results_new r  (cost=0.00..1045012.38 rows=340560 width=4)"
          Index Cond: (searches_id = 4351940)"
          Filter: ((created_date >= '2008-01-01 00:00:00'::timestamp without time zone) AND (created_date <= '2012-12-13 00:00:00'::timestamp without time zone))
4

1 に答える 1

1

それを見ると、データベースはsearches_id、範囲のルックアップよりも 1 つのルックアップが生成する行数が少ないと判断しましたcreated_date。(そして、2 つのインデックス スキャンの結果をビットマップと組み合わせることは価値がありません...)

このクエリが頻繁に必要な場合は、インデックスを作成することを検討してsearches_id, created_dateください。その後、両方の条件がインデックス条件に入る必要があります。

于 2012-12-12T19:27:13.237 に答える