![]() |
|
Модераторы: skyboy |
![]()
|
|
| Sunvas |
|
||||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Есть таблица с полем типа DATE. Нужно выбирать строки по нему. Есть два запроса с одинаковым результатом:
и
По сему вопрос: какой из этих запросов производительнее? -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
второй. кавычки вокруг чисолвых констант можно убрать.
------ логика первого: поле(значение поля) приводится к строковому типу, по которому производится поиск с использованием шаблонов(среди строковых функций медленнее like только regexp). логика второго: вычленяется целочисленное значение из целочисленного значения(видимо, при помощи простых арифметических операций). даже с приведением результата к строковому типу(так как у тебя константы - строковые) все равно должно получаться много быстрее первого варианта. но ключи не используются. ------ мне думается, вариант, использующий возможный ключ по полю `date`, должен выглядеть так:
|
|||
|
||||
| Sunvas |
|
||||||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Дело в том, что мне нужно извлекать даты исходя из поступивших значений значения месяца и года. С первым числом месяца проблем не возникнет:
Но вот если пихать последним 31:
То может возникнуть абсурд типа 2007-02-31, что будет в таком случае - я не знаю. Это сообщение отредактировал(а) Sunvas - 29.8.2008, 21:19 -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
||||||
|
|||||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
зачем тебе последний день месяца?
|
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Чтобы выбрать все строки из таблицы с датой этого месяца и не важно, каким днем.
-------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
я приводил пример. в нем выбираются все записи для "даты конкретного месяца с неважно каким днем". покажи мне, где там используется последний день месяца.
|
|||
|
||||
| Nigel |
|
|||
|
познаю мир ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 20.11.2007 Репутация: нет Всего: 19 |
А может проще date_format?
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
Nigel, вместо работы с целыми числами - преобразование в строку? кхм, к первоначальному вопросу про "запрос производительнее".
|
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
skyboy, в Вашем примере нужно увеличивать значение месяца на 1. А для этого нужно парсить входящую строку...
-------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
||||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Ищу варианты, чтобы все сделать максимально производительно. Кстати о каком втором варианте Вы говорите? -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
второй вариант. кстати говоря, раз уж тут отдельно - месяц и год, то и в этом случае придется парсить строку. но при большом количестве строк этот "единоразовый парсинг" будет незаметен на фоне выигрыша при использовании индекса по целочисленному полю(вариант "`date`>= '01-05-2007' AND `date`< '01-06-2007'") или при работе с числами вместо строк(WHERE MONTH(`date`)='5' AND YEAR(`date`)='2007'). |
|||
|
||||
| Nigel |
|
|||
|
познаю мир ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 20.11.2007 Репутация: нет Всего: 19 |
skyboy, и? При условии date<=/date>= все-равно будет идти сравнение строк. У автора дата же не в виде числа хранится |
|||
|
||||
| skyboy |
|
||||||||||||||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
мне казалось, что если дата хранится как положено - в datetime, то константа будет преобразована из строковой формы в числовую один раз. и потом будет использоваться возможный индекс на поле с датой... Добавлено через 11 минут и 48 секунд проводим эксперимент:
имеем одну запись. после чего выполняем запрос
несколько раз(я выполнил его 20 раз и получил, закономерно, 1048576 записей). после чего выполняем:
наблюдаем:
т.е. индекс работает. пробуем по-другому:
картина меняется незначительно:
индекс используется все равно. пробуем вариант с like:
К моему удивлению, индекс используется все равно:
по всей видимости, оптимизатор умнее меня вывод: по вопросам производительности лучше не искать совета со стороны, а самостоятельно провести полевые испытания. Добавлено через 12 минут и 52 секунды datetime - это число. то, что оно возвращается отформатированным в виде строки, не значит, что там и хранится строка. |
||||||||||||||||
|
|||||||||||||||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 6 Всего: 44 |
Тип date хранится как число дней(целый тип), прошедших с определенной даты. У разных СУБД эта стартовая дата может быть разная. Соответственно индекс по типу date сильно помогает в запросах.
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |