このクエリがうまく実行含まれていますRailsのクエリは上のチョーク
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
はLEFT JOIN
とjoins
になりますn INNER JOIN
。コマンドライン上でうまく実行
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
:問合せは、Railsのからである(joins
のために)吐き出します。
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
でplayers_to_teams
レコードを効率的にソートする方法はありますか? players
についてはFirstName
のインデックスがあります。
EDIT
はちゃんと半分も実行するクエリに必要な重い最適化をオンにします。クエリを分割することは、データの再構築やクエリのカスタマイズが不十分な最善の解決策でした。
すべての参加キーにもインデックスがありますか? – DGM
あなたが「酔っぱらいを止める」と言うと、どういうことが起こりますか? –
'screeching halt'は、レールコンソールを使用しているときにターミナルウィンドウが座って、Ctrl + Cキーを押すまで回転します。私は通常それをあきらめる数分前にそれを与えます。 –