MySQL воняет, делая коррелированные подзапросы быстро. Попробуйте сделать ваши подзапросы независимыми и присоединиться к ним. Вы можете использовать шаблон LEFT JOIN ... IS NULL
для замены WHERE NOT EXISTS
.
SELECT tc.*
FROM Timecards tc
LEFT JOIN TimecardBreakdown tcb ON tc.ID = tcb.TimeCardId
WHERE tc.DateIn >= CURRENT_DATE() - INTERVAL 2 MONTH
AND tc.Status <> 0
AND tcb.TimeCardId IS NULL
Некоторые точки оптимизации.
Во-первых, если вы можете изменить tc.Status <> 0
на tc.Status > 0
, он делает возможным сканирование диапазона индекса в этой колонке.
Во-вторых, когда вы оптимизируете вещи, SELECT *
считается вредным. Вместо этого, если вы можете указать имена только тех столбцов, которые вам нужны, все будет быстрее. Сервер базы данных должен перебирать все данные, которые вы запрашиваете; он не может сказать, проигнорируете ли вы некоторые из них.
В-третьих, этому запросу будет помогать составной индекс на Timecards (DateIn, Status, ID)
. Этот составной индекс можно использовать для выполнения тяжелых условий выполнения условий запроса.
Это называется индекс покрытия; он содержит данные, необходимые для удовлетворения большей части вашего запроса. Если бы вы указали только столбец DateIn
, тогда обработчик запроса должен был вернуться в основную таблицу, чтобы найти значения Status
и ID
. Когда эти столбцы появляются в индексе, это сохраняет дополнительную операцию.
Если у вас SELECT
определенный набор столбцов, а не SELECT *
, в том числе эти столбцы в индексе покрытия могут значительно повысить производительность запросов. Это одна из нескольких причин, по которой SELECT *
считается вредным.
(. Некоторые марки и модели СУБД имеют способы задания списков столбцов проехаться по индексам без фактического их индексации MySQL требует индексировать их, но покрывающие индексы по-прежнему помогают.).
Прочитайте это: http://use-the-index-luke.com/
Лучше индексировать B или B + деревья в БД. –
Как я могу это сделать? – user3338040
Обычно при обращении за помощью требуется оптимизация запроса для включения полных определений соответствующих таблиц. Результат «EXPLAIN» для запроса также пригодится. –