私はこの質問が100回尋ねられていることを知っています。これは "どうやってやるの?"ではなく、効率的な質問です。約。"最も最近の行"に参加する最も効率的な方法
私のインターネットの読書から、私はそれがかなり効率的であると聞こえる最新の問題を解決する一つの方法を決めました - マッチする条件でグループ化された "最大"テーブルをLEFT JOINし、LEFT JOINグループ化された条件。このようなもの:
Select employee.*, evaluation.* form employee
LEFT JOIN (select max(report_date) report_date, employee_id
from evaluation group by employee_id) most_recent_eval
on most_recent_eval.employee_id = employee.id
LEFT JOIN evaluation
on evaluation.employee_id = employee.id and evaluation.report_date = most_recent_eval.report_date
私には分からない問題がありますか?これは2回のテーブルスキャン(1つは最大値、1つは行を見つける)ですか?それはすべての従業員のために2フルスキャンを行う必要がありますか?
最新の行(評価、セキュリティのクリアランス、プロジェクト)が必要な3つのテーブルに参加しようとしているので、非効率的なものが大規模に増えるようです。
誰も私にこれに関するいくつかのアドバイスを与えることができますか?
'explain select ...'を実行すると、クエリ。 MySQLのウェブサイトには、結果を解釈する方法の詳細なガイダンスがあります。 Explain出力がなければ、照会の効率はわかりません。 – Shadow
これは単純な例であり、無関係の列がたくさん含まれている実際のクエリの出力で問題をクラウド化しないようにしています。私は本当に "最近の"結合を解決する様々な方法の効率に関するより一般的なガイダンスを探しています。私は今説明の出力の本を開封しますので、そのポインタに感謝します。 – whiteatom
Explainの結果を見ると、最も最近のevalが派生テーブルのデカルト結合(結合タイプのALLを表示)を実行するためのサブクエリが表示されます。私はstart_dateのインデックスを持っています - それは使わないべきでしょうか? – whiteatom