Има решение за това в 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 derived_t2 ON t1.f1=derived_t2.f1;
В документацията се казва:„Оптимизаторът изгражда индекс върху колона f1 от derived_t2, ако това би позволило използването на ref достъп за план за изпълнение с най-ниска цена.“
Добре, това е страхотно, но оптимизаторът използва ли повторно индекси от t2? С други думи, какво ще стане, ако съществува индекс за t2.f1? Този индекс използва ли се повторно или оптимизаторът създава отново този индекс за извлечената таблица? Кой знае?
РЕДАКТИРАНЕ: Най-доброто решение до MySQL 5.6 е да създадете временна таблица, да създадете индекс на тази таблица и след това да изпълните заявката SELECT на временната таблица.