【发布时间】:2016-01-12 16:56:09
【问题描述】:
我对 ActiveRecord 和 MySQL 进行了以下设置:
-
用户通过会员拥有许多
groups -
组通过会员拥有许多
users
schema.rb 中还描述了 group_id 和 user_id 的索引:
add_index "memberships", ["group_id", "user_id"], name: "uugj_index", using: :btree
3 个不同的查询:
User.where(id: Membership.uniq.pluck(:user_id))
(3.8ms)从
memberships中选择不同的memberships.user_id用户负载 (11.0ms) SELECTusers.* FROMusersWHEREusers.idIN (1, 2...)
User.where(id: Membership.uniq.select(:user_id))
用户负载 (15.2ms) SELECT
users.* FROMusersWHEREusers.idIN (SELECT DISTINCTmemberships.user_idFROMmemberships)
User.uniq.joins(:memberships)
用户负载 (135.1ms) SELECT DISTINCT
users.* FROMusersINNER JOINmembershipsONmemberships.user_id=users.id
执行此操作的最佳方法是什么?为什么使用 join 的查询慢很多?
【问题讨论】:
-
请尝试包含。我很确定。这将花费相对较少的时间。
User.uniq.includes(:memberships) -
除非您计划让您的用户成为同一组的成员两次 - 您应该使您的索引唯一。
标签: mysql ruby-on-rails ruby-on-rails-4 activerecord database-performance