2014-02-12 4 views
0

Вот предложение where SQL. когда Я удаляю эту часть, это занимает 3 минуты, чтобы выполнить, с этим он принимает более 15 минут Есть почти 9000 записей в БДНужно оптимизировать SQL-запрос

WHERE username = 'xyz' AND 
( 
    (acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29') 
    OR 
    ( 
     YEAR(acceptedfordeliverytime) = YEAR('2013-1-29') 
     AND 
     MONTH(acceptedfordeliverytime) = MONTH('2013-1-29') 
     AND 
     DAY(acceptedfordeliverytime) = DAY('2013-1-29') 
    ) 
    OR 
    ( 
     YEAR(acceptedfordeliverytime) = YEAR('2012-9-1') 
     AND 
     MONTH(acceptedfordeliverytime) = MONTH('2012-9-1') 
     AND 
     DAY(acceptedfordeliverytime) = DAY('2012-9-1') 
    ) 
) 
+1

Для начала, вместо использования ГОДА ('2012-9-1'), вы не могли бы просто указать значение года – DhruvJoshi

+0

Также рассмотрите возможность создания правильных индексов. – Jade

ответ

2

Почему вы не просто использовать:

WHERE username = 'xyz' AND 
     (acceptedfordeliverytime >= '2012-09-01' AND 
     acceptedfordeliverytime < '2013-01-30' 
    ) 

Это также позволит использовать индекс (username, acceptedfordeliverytime) для выполнения запроса.

+0

Можете ли вы дать небольшое объяснение в отношении 'index on (username, acceptedfordeliverytime)' –

+0

Это будет индекс, который, вероятно, поможет выполнить запрос быстрее. –

+0

Извините, скажу .. Я не знаю, как использовать индекс :(Можете ли вы мне помочь? –

0

Я думаю, что это даст вам те же результаты. , а также сделать индекс для столбца acceptfordeliverytime, чтобы ускорить поиск.

WHERE username = 'xyz' AND acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29' 
0

Не МЕСЯЦ включительно? Это означало бы, что вам не нужны все дополнительные оговорки (которые проверяют на первую и последнюю дату ОЧЕНЬ сложным образом). Я верю, что ваш запрос вернет тот же результат, если вы только что сделали:

WHERE username = 'xyz' AND 
( 
    acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29' 
) 
0

Ваша обе части ИЛИ не нужны.

при использовании

acceptedfordeliverytime Between '2012-9-1' AND '2013-1-29' 

Он используется как дата включены так или часть не требуется. если у вас есть дата и время в вашей базе данных, то вы можете преобразовать его в дату, как это

CAST(acceptedfordeliverytime as date) Between '2012-9-1' AND '2013-1-29' 
Смежные вопросы