Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 16:30   #1
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию оптимизировать запрос (индекс + LIKE)

Есть таблица, там несколько млн строк, есть индекс на поле birth_date, само поле типа DATE хранит данные в виде 1987-05-23.
Нужно сделать выборку всех пользователей у которых день рождения сегодня. На данный момент запрос выглядит так:
PHP код:
SELECT FROM users WHERE birth_date LIKE '%-11-30' 
но вот за счет того что используется LIKE запрос выполняется около 2х секунд, т.е. то что birth_date имеет индекс совершенно не дает никакой производительности в выборке. К примеру если делаю выборку типа
PHP код:
SELECT FROM users WHERE id 234324 
то такой запрос выполняется очень быстро, менее 0.1 сек, так как использует индексы.
Подскажите в данном случае можно ли как-то реализовать выборку по быстрее?
Решение типа создать отдельно поля для записи месяца и дня рождения не проходят, так как это затронет весь проэкт, и придется вносить очень очень много изменений. Предпочтительно ничего не менять, кроме запроса на выборку.
iankov вне форума Ответить с цитированием
Старый 30.11.2010, 16:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробуй что-то:
Код:
SELECT * FROM users WHERE Year(birth_date)=year(GETDATE())
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2010, 16:46   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Like - это нечёткий поиск, поэтому, обычно, индекс либо совсем не используется, либо используется частично (малоэффективно)..

Вы не написали, какая у Вас СУБД. Но, в любой нормальной современной СУБД есть поле Date (или DateTime, или Дата или ДатаВремя и т.д.) и дату рождения надо хранить именно в формате Date (DateTime ). Потому что в СУБД есть функции, получения даты, месяца, года из переменных такого типа.
Это и само по себе будет быстрее, чем LIKE + при необходимости по ним тоже можно индексировать.
либо банально разделите поле на три разных поля. Постройте по ним индекс. и всё будет "летать"!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2010, 17:02   #4
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

MYSQL 5.x у меня
iankov вне форума Ответить с цитированием
Старый 01.12.2010, 09:34   #5
BeJIuKuu_Hexo4yxa
Пользователь
 
Регистрация: 13.10.2010
Сообщений: 96
По умолчанию

В Oracle можно строить индекс, используя не само поле, а функцию от него (не разбивая на несколько полей), например
to_char(birth_date,'mm.dd') - это месяц и день (я так понимаю, требуется дата без года).
Скорее всего в MYSQL есть что-то подобное

Только в вызове использовать не само поле, а функцию от него, как в индексе
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (Стив Макконнелл)

Последний раз редактировалось BeJIuKuu_Hexo4yxa; 01.12.2010 в 09:36.
BeJIuKuu_Hexo4yxa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать sql запрос Hottabych SQL, базы данных 0 02.06.2010 00:16
Индекс числа VenomMag55 Помощь студентам 2 09.02.2010 16:09
Индекс в дочерней таблице VistaSV30 Microsoft Office Access 3 13.01.2010 11:58
Индекс не срабатывает GenniY БД в Delphi 4 24.11.2009 15:05
Как оптимизировать запрос MySQL с выборкой из двух таблиц. Johnatan SQL, базы данных 6 13.04.2008 03:10