У меня есть следующая настройка с 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_id
FROMmemberships
Пользовательская нагрузка (11.0ms) SELECTusers
. * FROMusers
WHEREusers
.id
IN (1, 2...)
User.where(id: Membership.uniq.select(:user_id))
Загрузка пользователя (15.2мс) SELECT
users
. * FROMusers
WHEREusers
.id
IN (SELECT DISTINCTmemberships
.user_id
FROMmemberships
)
User.uniq.joins(:memberships)
Пользовательская нагрузка (135.1ms) SELECT DISTINCT
users
. * FROMusers
INNER JOINmemberships
ONmemberships
.user_id
=users
.id
Каков наилучший подход для этого? Почему запрос с соединением намного медленнее?