gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:45:55 25 4
gpt4 key购买 nike

我想知道为什么要这样做

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

运行需要 1213 毫秒。有点慢吗?

在 schema.rb user_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') 导致查询变慢。但为什么?难道不快点点菜吗?

我在 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

快多了!有什么问题吗?

有几点我应该提一下:

  1. 如果您还没有注意到,这是一个多态表。
  2. 过去,我通过 t.rename :live_viewable_type, :user_viewable_type 通过 Rails 迁移将 :live_viewable_type 重命名为 :user_viewable_type。但是,我不认为这应该是问题所在,因为索引仍在正确的列中。

最佳答案

据我所知,问题可能在于:

a) 您没有在 created_at 上编入索引

或:

b) 数据库正在选择一个索引或另一个索引(即使用 created_at 索引,使 user_viewable_type 规范变慢,反之亦然)。

如果您经常进行这些调用,可能值得查看 [created_at, user_viewable_type] 上的组合索引(或其他方式:[user_viewable_type, created_at],这取决于哪个会更快地缩小您的结果)。

关于sql - 为什么这个查询运行缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com