このクエリは問題なく実行されます。
p = PlayersToTeam.select("id").joins(:player).limit(10).order("players.FirstName")
このクエリにより、システム全体が金切り声で停止します。
p = PlayersToTeam.select("id").includes(:player).limit(10).order("players.FirstName")
モデルは次のとおりです。
class PlayersToTeam < ActiveRecord::Base
belongs_to :player
belongs_to :team
accepts_nested_attributes_for :player
end
class Player < ActiveRecord::Base
has_many :players_to_teams
has_many :teams, through: :players_to_teams
end
私が知る限り、includes
は aLEFT JOIN
を実行し、 をjoins
実行しINNER JOIN
ます。joins
Rails から吐き出されるクエリ ( for ) は次のとおりです。
SELECT players_to_teams.id FROM `players_to_teams` INNER JOIN `players` ON `players`.`id` = `players_to_teams`.`player_id` ORDER BY players.FirstName LIMIT 10
コマンドラインで問題なく実行されます。
SELECT players_to_teams.id FROM `players_to_teams` LEFT JOIN `players` ON `players`.`id` = `players_to_teams`.`player_id` ORDER BY players.FirstName LIMIT 10
も問題なく実行され、2 倍の時間がかかります。
players_to_teams
経由でレコードをソートできる効率的な方法はありplayers
ますか? のインデックスがありFirstName
ますplayers
。
編集
クエリを適切に実行するには、かなりの最適化が必要であることが判明しました。クエリの分割は、データの再構築やクエリのカスタマイズを除けば、最善の解決策でした