У меня есть следующая настройка с ActiveRecord и MySQL:
Пользователь имеет много групп через членство
Группа имеет много пользователей через членство
Существует также индекс group_id и user_id, описанный в schema.rb:
add_index "memberships", ["group_id", "user_id"], name: "uugj_index", using: :btree
3 разных запроса:
User.where(id: Membership.uniq.pluck(:user_id))`
(3,8 мс) SELECT DISTINCT
memberships.user_idFROMmembershipsПользовательская нагрузка (11.0ms) SELECTusers. * FROMusersWHEREusers.idIN (1, 2...)
User.where(id: Membership.uniq.select(:user_id))
Загрузка пользователя (15.2мс) SELECT
users. * FROMusersWHEREusers.idIN (SELECT DISTINCTmemberships.user_idFROMmemberships)
User.uniq.joins(:memberships)
Пользовательская нагрузка (135.1ms) SELECT DISTINCT
users. * FROMusersINNER JOINmembershipsONmemberships.user_id=users.id
Каков наилучший подход для этого? Почему запрос с соединением намного медленнее?