Sql 为什么这个查询运行缓慢?

Sql 为什么这个查询运行缓慢?,sql,ruby-on-rails,ruby-on-rails-3,postgresql,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,我想知道你为什么这么做 UserView.where(:user_viewable_type => 'Song').order('created_at desc').limit(5) 运行需要1213毫秒。有点慢,不是吗 在schema.rb中,用户可查看类型被索引: add_index "user_views", ["user_viewable_type"], :name => "index_views_on_viewable_type" 即使在psql中: "index_v

我想知道你为什么这么做

UserView.where(:user_viewable_type => 'Song').order('created_at desc').limit(5) 
运行需要1213毫秒。有点慢,不是吗

在schema.rb
中,用户可查看类型
被索引:

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
似乎是
顺序('created_at desc')
导致查询速度变慢。但是为什么呢?点菜不是要快吗

我在
id
列上尝试了
order

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迁移,通过
    t将
    :live\u viewable\u type
    重命名为
    :user\u viewable\u type
    。但是,我认为这不应该是问题所在,因为索引仍然在右边的列上

  • 据我所知,问题可能是:

    a) 在

    或:

    b) 数据库正在选择一个索引或另一个索引(即使用在索引处创建的
    ,使
    用户类型
    规范变慢,反之亦然)


    如果您经常打这些电话,可能值得查看
    [创建时,用户可查看时类型]
    上的组合索引(或者另一种方式:
    [用户可查看时类型,创建时类型]
    ,这取决于哪种方式将更快地缩小结果范围)。

    将问题中的“解释”替换为“解释分析”,我刚读过一篇类似的文章,解释了你的建议:对,他写的东西和我想的很像。如果您对
    [在创建时,用户可查看类型]
    进行索引,您的结果会更好吗?