Предположим, у вас есть запрос, подобный этому ...
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
Для выполнения одной задачи может быть назначено несколько человек.Цель этого запроса - показать по одной строке для каждой задачи, но с людьми, назначенными для этой задачи, в одном столбце
Теперь ... предположим, что у вас настроены правильные индексы на tasks
, users
и tasks_assigned_users
.Оптимизатор MySQL по-прежнему не будет использовать индекс TaskID при присоединении tasks
к производной таблице.WTF?!?!?
Итак, мой вопрос ... как сделать так, чтобы этот запрос использовал индекс для tasks_assigned_users.TaskID?Временные таблицы не работают, поэтому, если это единственное решение ... MySQL Optimizer глупо.
Используемые индексы:
- tasks
- пользователи
- tasks_assigned_users
- ПЕРВИЧНЫЙ - (TaskID, UserID)
- Дополнительный индекс UNIQUE - (UserID, TaskID)
EDIT: Кроме того, эта страница говорит, что производные таблицы выполнены/ материализован до того, как произойдет соединение.Почему бы не использовать ключи повторно для объединения?
РЕДАКТИРОВАТЬ 2: Оптимизатор MySQL не позволит помещать подсказки индекса в производные таблицы (предположительно потому, чтонет индексов для производных таблиц)
РЕДАКТИРОВАТЬ 3: Вот действительно хороший пост в блоге об этом: http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ Обратите внимание, что дело № 2 - это решение, которое я ищудля, но похоже, что MySQL не поддерживает это в настоящее время.: (
РЕДАКТИРОВАТЬ 4: Только что найдено this : "Начиная с MySQL 5.6.3, оптимизатор более эффективно обрабатывает подзапросы в предложении FROM (то есть, является производнымтаблицы): ... Во время выполнения запроса оптимизатор может добавить индекс в производную таблицу, чтобы ускорить извлечение строки из нее. "Кажется многообещающим ...