2017-02-08 11 views
0

У меня есть этот запрос, который показывает мне последний id по id_units, в зависимости от даты.Оптимизировать запрос с MAX (id)

Мой запрос:

SELECT max(swg.id) AS id 
FROM swg 
WHERE swg.status != 0 
AND sg.dateswg <= TIMESTAMPADD(DAY,(6-WEEKDAY('2015-12-28')),'2015-12-28') 
GROUP BY swg.id_units 
ORDER BY swg.id; 

Запрос возвращает более 2000 записей, я думаю, что есть способ, что я могу производительность этого запроса.

Я пытаюсь производительность моего запроса, как это:

SELECT id 
FROM (SELECT * FROM swg WHERE status != 0 AND dateswg <= TIMESTAMPADD(DAY,(6-WEEKDAY('2015-12-28')),'2015-12-28') ORDER BY id_units, id desc) x 
GROUP BY id_units; 

Это работает, но я хотел бы знать, если есть другой способ улучшить его

Regard!

+1

У вас есть какой-либо индекс? –

+0

Сделайте 'ORDER BY id' вместо этого, чтобы сделать запрос правильным! – jarlh

+0

Нет У меня нет @Prdp –

ответ

0

Это ваш запрос:

SELECT max(swg.id) AS id 
FROM swg 
WHERE swg.status <> 0 AND 
     swg.dateswg <= TIMESTAMPADD(DAY, 6 - WEEKDAY('2015-12-28'), '2015-12-28') 
GROUP BY swg.id_units 
ORDER BY MAX(swg.id); 

Это сложно оптимизировать, потому что индекс не может быть использован для обоих условий. Вы можете начать с композитным индексом на всех четырех столбцов, используемых в запросе: swg(dateswg, status, id_units, id)

+0

Спасибо за ваш ответ, я рассмотрю, как я могу это сделать ° –

0

Из status только либо 0 или 1, а затем перейти к status = 1 так, что оптимизатор имеет одно место, чтобы посмотреть, а не два непересекающихся места. Тогда есть

INDEX(status, dateswg, id_units, id) -- in this order. 

Это будет очень хорошо для WHERE и будет «покрытие».

К сожалению, и GROUP BY, и ORDER BY понадобится; последний будет 2000 строк и, вероятно, будет выполнен в ОЗУ; Я не могу сказать о первом.

Смежные вопросы