2010-10-27 9 views
0

У меня проблема с этим запросом, сложность этого запроса не очень хорошая, я использую этот запрос из долгого времени, и теперь эта база данных имеет много строк, чтобы получить выбор по этому методу. Все индексы добавляются должным образом. Я ищу какой-то другой метод для оптимизации этого запроса по дате, потому что это узкое место в этом решении.Как оптимизировать этот запрос, используя сравнение даты в SQL?

SELECT (...) FROM table 
WHERE (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) >= (var_0 * 10000 + var_1 * 100 + var_2) and 
     (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) <= (var_3 * 10000 + var_4 * 100 + var_5) 

Может ли кто-нибудь мне помочь? Приветствия

+0

, связанные с: http://stackoverflow.com/questions/1765667/mysql-date-function-running-insanely-slow-in-left-join –

ответ

2

Я бы предложил использовать встроенные сравнения даты mysql.

row_add_date <= '20101027' and row_add_date >= '20101027' 

Но обратите внимание, что это странное испытание в первую очередь: не только тестирование, что дата равна 27 октября, как это:

row_add_date = '20101027' 
+0

«0» = 0 это на практике «0» = var_1, я пропустил это. – Svisstack

+0

Спасибо, что эта проблема решена, и запрос выполняется в 372 раза быстрее. Я пытаюсь это, но с '-' bettwen значениями, но тогда это не работает. – Svisstack

2

Почему вы нарушаете дату? Per-row функции do не шкала хорошо. Мне кажется, что весь раздел даты в конце может быть заменен:

where row_add_date = '2010-10-27' 

Даже если вы хотите диапазон, вы все еще лучше использовать даты, как они.


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

+0

Закрыть, он может заменить на 'row_add_date> = '2010-10-27' и row_add_date <'2010-10-28'' – Andomar

+0

Вау, ты прав :) полностью пропустил это. это выглядело так ужасно, что я не пытался и не понял расчет –

+0

Я обновил вопрос, эти значения являются переменными и не равны в запросе, извините за пропустить это. – Svisstack

0

Я собираюсь угадать что row_add_date имеет тип datetime. Если это так, вам нужно повернуть 20101027 в datetime и сравнить столбец с этим.

Другими словами:

row_add_date >= firstDateTime and row_add_date <= secondDateTime