gpt4 book ai didi

ruby-on-rails - 使用 AMS 加速大数据图查询和渲染

转载 作者:行者123 更新时间:2023-12-04 06:31:06 25 4
gpt4 key购买 nike

我有一个跨越多个表的查询,它最终使用 Active Model Serializers 来呈现数据。目前大部分时间都花在序列化程序上,因为我被迫从序列化程序本身内部查询一些数据。我想找到一种方法来加快速度,这可能不使用 AMS(这没关系)。

我的数据模型如下:

Location
-> Images
-> Recent Images
-> Days Images
Image
-> User
recent_imagesdays_imagesimages 相同但有范围做 where按天和 limit 过滤到 6。

目前,整个过程在本地需要大约 15 秒,在生产中需要 2-4 秒。我觉得我可以更快地执行此操作,但不完全确定如何修改我的代码。

获取 Location 的查询是:
ids = @company
.locations
.active
.has_image_taken
.order(last_image_taken: :desc)
.page(page)
.per(per_page)
.pluck(:id)
Location.fetch_multi(ids)
fetch_multi来自 identity_cache gem 。这些结果然后击中序列化程序,即:
class V1::RecentLocationSerializer < ActiveModel::Serializer
has_many :recent_images, serializer: V1::RecentImageSerializer do
if scope[:view_user_photos]
object.fetch_recent_images.take(6)
else
ids = object.recent_images.where(user_id: scope[:current_user].id).limit(6).pluck(:id)
Image.fetch_multi(ids)
end
end

has_many :days_images do
if scope[:view_user_photos]
object.fetch_days_images
else
ids = object.days_images.where(user_id: scope[:current_user].id).pluck(:id)
Image.fetch_multi(ids)
end
end
end

最近和天图像的范围是:
scope :days_images, -> { includes(:user).active.where('date_uploaded > ?', DateTime.now.beginning_of_day).ordered_desc_by_date }
scope :recent_images, -> { includes(:user).active.ordered_desc_by_date }

我的问题是,您是否认为我需要放弃 AMS,这样我就不必在序列化程序中进行查询,如果是这样,您建议如何呈现它?

最佳答案

我可能错过了这里的重点 - 哪个部分很慢?日志是什么样的?您是否缺少数据库索引?我在那里没有看到很多连接,所以也许你只需要一个关于 date_uploaded(可能还有 user_id)的索引。我没有看到任何正在进行一系列序列化的内容。

您可以通过多种方式轻松加速 sql - 例如,使用 user_active bool 值更新图像的触发器(在 ruby​​ 或 sql 中),以便您可以转储该连接。 (您将其包含在索引中)

或者仅使用其中的 ID 构建一个缓存表。有点像倒排索引(我也在 redis 中这样做,但那是我),每个用户/位置都有一行,在上传图像时更新。

将工作推送到图像上传而不是现在的位置,查看列表。

关于ruby-on-rails - 使用 AMS 加速大数据图查询和渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43498386/

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