Предположим, у вас есть запрос, как это ...Как сообщить оптимизатору MySQL использовать индекс в производной таблице?
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 - это глупо.
Индексы используются:
- задача
- ПЕРВИЧНЫХ - TaskID
- пользователей
- ПЕРВИЧНОГО - Идентификатор_пользователь
- tasks_assigned_users
- PRIMARY - (TaskID, Идентификатор_пользователя)
- Дополнительный индекс UNIQUE - (Идентификатор_пользователя, TaskID)
EDIT: Кроме того, this page говорит, что производные таблицы выполняются/материализовался перед тем присоединяется произойти , Почему бы не повторно использовать ключи для выполнения соединения?
EDIT 2: MySQL Optimizer не позволит вам ставить index hints на производные таблицы (предположительно, потому что нет индексов на производных таблиц)
EDIT 3: Вот действительно хороший блог об этом : http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ Обратите внимание, что решение # 2 - это решение, которое я ищу, но похоже, что MySQL в настоящее время не поддерживает это. :(
EDIT 4: Просто найти this: «По MySQL 5.6.3, оптимизатор более эффективно обрабатывает подзапросы в предложении FROM (то есть производные таблицы): ... Во время выполнения запроса, оптимизатор может добавить индекс к производной таблице, чтобы ускорить извлечение строк из него. «Кажется перспективным ...
Можете ли вы также добавить индексы, которые используете? Я предполагаю, что у вас есть PK для задач и не уникальный индекс для tasks_assigned_users. – Luis
@ Luis - отредактировал вопрос для вас :) – BMiner
У вас есть идентификатор группы GROUP BY, который подразумевает, что несколько человек могут работать над заданной задачей, что также подразумевает некоторую агрегацию. Вы хотите, чтобы все люди, назначенные для заданной задачи, были указаны в одном столбце возврата, связанном с задачей? Или вы действительно хотите, чтобы все были назначены на задание, а эти задачи не назначены, пусть это пустое. Возможно, даже нажмите любые задачи UNASSIGNED в верхнюю (или нижнюю) список ... – DRapp