Нет, вы не должны, ваш запрос в порядке.
Просто создайте индекс для jobs (year, month, location, tool_code)
и tools (tool_code)
, чтобы можно было использовать INDEX FOR GROUP-BY
.
В статье, которую вы предоставили, описаны предикаты подзапроса (IN (SELECT ...)
), а не вложенные запросы (SELECT FROM (SELECT ...)
).
Даже с подзапросами статья ошибочна: хотя MySQL
не может оптимизировать все подзапросы, он отлично справляется с IN (SELECT …)
предикатами.
Я не знаю, почему автор решил поставить DISTINCT
здесь:
SELECT id, name, price
FROM widgets
WHERE id IN
(
SELECT DISTINCT widgetId
FROM widgetOrders
)
и почему они думают, что это поможет повысить производительность, но, учитывая, что widgetID
проиндексирован, MySQL
просто преобразует этот запрос:
SELECT id, name, price
FROM widgets
WHERE id IN
(
SELECT widgetId
FROM widgetOrders
)
в index_subquery
По сути, это похоже на предложение EXISTS
: внутренний подзапрос будет выполняться один раз для строки widgets
с добавленным дополнительным предикатом:
SELECT NULL
FROM widgetOrders
WHERE widgetId = widgets.id
и остановка на первом матче в widgetOrders
.
Этот запрос:
SELECT DISTINCT w.id,w.name,w.price
FROM widgets w
INNER JOIN
widgetOrders o
ON w.id = o.widgetId
придется использовать temporary
, чтобы избавиться от дубликатов, и будет намного медленнее.