3

なんでやってるのかな

UserView.where(:user_viewable_type => 'Song').order('created_at desc').limit(5) 

実行には1213msかかります。少し遅いinit?

schema.rbuser_viewable_typeでインデックスが作成されます:

add_index "user_views", ["user_viewable_type"], :name => "index_views_on_viewable_type"

psqlでも:

"index_views_on_viewable_type" btree (user_viewable_type)

.explainリターンで実行:

UserView.where(:user_viewable_type => 'Song').order('created_at desc').limit(5).explain
  UserView Load (1801.4ms)  SELECT "user_views".* FROM "user_views" WHERE "user_views"."user_viewable_type" = 'Song' ORDER BY created_at desc LIMIT 5
  EXPLAIN (1.6ms)  EXPLAIN SELECT "user_views".* FROM "user_views" WHERE "user_views"."user_viewable_type" = 'Song' ORDER BY created_at desc LIMIT 5
=> "EXPLAIN for: SELECT  \"user_views\".* FROM \"user_views\"  WHERE \"user_views\".\"user_viewable_type\" = 'Song' ORDER BY created_at desc LIMIT 5\n                                  QUERY PLAN\n-------------------------------------------------------------------------------\n Limit  (cost=17113.28..17113.28 rows=5 width=37)\n   ->  Sort  (cost=17113.28..17147.82 rows=69085 width=37)\n         Sort Key: created_at\n         ->  Seq Scan on user_views  (cost=0.00..16883.78 rows=69085 width=37)\n               Filter: ((user_viewable_type)::text = 'Song'::text)\n(5 rows)\n"

そこで、クエリを分解して削除することにしましたorder

UserView.where(:user_viewable_type => 'Song').limit(5).explain
UserView Load (1.6ms)  SELECT "user_views".* FROM "user_views" WHERE "user_views"."user_viewable_type" = 'Song' LIMIT 5

order('created_at desc')クエリが遅くなったようです。しかし、なぜ?ソウルは速く注文しませんか?

私はコラムを試しorderてみました:id

UserView.where(:user_viewable_type => 'Song').order('id desc').limit(5).explain
UserView Load (44.8ms)  SELECT "user_views".* FROM "user_views" WHERE "user_views"."user_viewable_type" = 'Song' ORDER BY id desc LIMIT 5

とても速い!何が間違っている可能性がありますか?

私が言及しなければならないいくつかのこと:

  1. まだ気づいていないのであれば、これは多形テーブルです。
  2. 以前は、を介したRailsの移行を介して、に名前を変更:live_viewable_typeしました。ただし、インデックスはまだ右側の列にあるため、これが問題になることはないと思います。:user_viewable_typet.rename :live_viewable_type, :user_viewable_type
4

1 に答える 1

3

私が知る限り、問題は次のいずれかである可能性があります。

a)インデックスに登録されていませんcreated_at

また:

b)データベースがどちらかのインデックスを選択している(つまり、created_atインデックスを使用するか、user_viewable_type仕様を遅くするか、またはその逆)。

これらの呼び出しを頻繁に行う場合は、の組み合わせインデックスを調べる価値があるかもしれません[created_at, user_viewable_type](または、逆[user_viewable_type, created_at]に、どちらが結果をより迅速に絞り込むかによって異なります)。

于 2012-08-09T17:42:27.610 に答える