なんでやってるのかな
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
とても速い!何が間違っている可能性がありますか?
私が言及しなければならないいくつかのこと:
- まだ気づいていないのであれば、これは多形テーブルです。
- 以前は、を介したRailsの移行を介して、に名前を変更
:live_viewable_type
しました。ただし、インデックスはまだ右側の列にあるため、これが問題になることはないと思います。:user_viewable_type
t.rename :live_viewable_type, :user_viewable_type