2016-09-26 6 views
0

日付範囲のクエリがインデックスに表示されているようですが、まだ遅いです。約30M行のテーブル。私はスピードアップするために何ができる?日付範囲クエリを最適化する

User.messages.where(message_type: 'incoming').where(created_at: start_date..end_date).explain 


Message Load (8322.3ms) SELECT "messages".* FROM "messages" WHERE "messages"."user_id" = $1 AND "messages"."message_type" = $2 AND ("messages"."created_at" BETWEEN '2016-09-23 00:00:00.000000' AND '2016-09-23 23:59:59.999999') [["user_id", 1], ["message_type", "incoming"]] 

QUERY PLAN 

Index Scan using index_messages_on_created_at on messages (cost=0.09..21223.80 rows=136690 width=527) 
     Index Cond: ((created_at >= '2016-09-23 00:00:00'::timestamp without time zone) AND (created_at <= '2016-09-23 23:59:59.999999'::timestamp without time zone)) 
     Filter: ((user_id = 1) AND ((message_type)::text = 'incoming'::text)) 
     (3 rows) 

答えて

0

(user_id, message_type, created_at)のインデックスが理想的です。これにより、postgresは指定されたクエリをそのインデックスのみを使用して実行できます。

+0

これは、より厳密な日付範囲(1日)に役立ちますが、クエリが多すぎる週/月の日付範囲では無視されます。 – mnort9

+0

テーブルに対して 'ANALYZE'を実行しましたか? 'ANALYZE"メッセージ ";'を実行し、再度クエリを実行してください。 – redneb

+0

同じこと。照会された行数は一部のユーザーで500Kを超えており、表には30M行しかありません。それはおそらく選択的ではないでしょうか? – mnort9

関連する問題