MySQL Server 5.6には、これに対する解決策があります-プレビューリリース(この記事の執筆時点)。
http://dev.mysql.com /doc/refman/5.6/en/from-clause-subquery-optimization.html
ただし、MySQL Optimizerが「派生テーブルにインデックスを追加する」ときに、既存のインデックスを再利用するかどうかはわかりません。
次のクエリについて考えてみます。
SELECT * FROM t1JOIN(SELECT * FROM t2)AS Delivered_t2 ON t1.f1 =defined_t2.f1;
ドキュメントには次のように書かれています。「オプティマイザーは、derived_t2から列f1にインデックスを作成します。そうすることで、最低コストの実行プランでrefアクセスを使用できるようになります。」
OK、それは素晴らしいことですが、オプティマイザーはt2からのインデックスを再利用しますか?つまり、t2.f1にインデックスが存在する場合はどうなるでしょうか。このインデックスは再利用されますか、それともオプティマイザは派生テーブルに対してこのインデックスを再作成しますか?誰が知っていますか?
編集: MySQL 5.6までの最善の解決策は、一時テーブルを作成し、そのテーブルにインデックスを作成してから、一時テーブルでSELECTクエリを実行することです。