【发布时间】:2020-01-04 14:38:20
【问题描述】:
我在对数千条记录使用 limit 时遇到性能问题。
是否有任何替代方法limit 活动记录提供或解决方法?
我的查询是Spot.where(<where_conditions>).limit(20)
我想过的一些解决方案;
使用
where子句来限制记录,而不是where("created_at > ? and created_at < ?", 10.days.ago, 10.days.ago)从主要的
where查询中提取ids,然后进行附加查询以获取前20 个ids = where(<where_conditions>).order('created_at ASC').pluck(:id),然后是where(id: ids.take(20)).order('created_at ASC')。担心会有内存使用。
【问题讨论】:
-
.limit链方法实际上转换为 sqlLIMIT,所以如果您遇到性能问题,您可能需要查看数据库级别的问题。 -
使用
.explain来检查实际花费的时间。我怀疑使用WHERE (subquery)会比仅仅对查询应用限制更快。where(id: ids)实际上更糟,因为您正在执行一个额外的查询,该查询必须对数据库进行并返回。
标签: ruby-on-rails database activerecord