syfisher
TDD infected!!
Использование индекса при сортировке и условии на период
Вопрос про индексы. Вернее, хочу проверить, все ли я правильно понял.
Есть задача - выводить последние пять up-to-date новостей.
Структура таблицы:
DB - MySQl 4.1 WinXp
У меня есть запрос:
где 1170409732 - timestamp текущего времени.
Индекс date при таком запросе не используется. Если поле news_date в индексе поставить первым - используется, но не помогает в ограничении размера выборки, идет сканирование всей таблицы.
Первоначальный индекс используется, если иметь явные сравнения с date_start и date_end, но мне нужно выбирать только up-to-date новости.
В общем-то мотивы, по которым MYSQL отказывается использовать индекс, мне понятны.
В итоге - мне придется применить условие news_item.date_start <=1170409732 AND news_item.date_end >=1170409732 - отдельно:
1) или отдельным запросом(подзапросом)
2) или создать поле is_up_to_date и заполнять его вне основного приложения, например, раз в день по cron
Вопрос про индексы. Вернее, хочу проверить, все ли я правильно понял.
Есть задача - выводить последние пять up-to-date новостей.
Структура таблицы:
Код:
CREATE TABLE `news_item` (
`id` bigint(20) NOT NULL auto_increment,
`annotation` text,
`content` longtext,
`news_date` int(11) default NULL,
`date_start` int(11) default NULL,
`date_end` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `node_id` (`node_id`),
KEY `date` (`date_start`,`date_end`,`news_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
У меня есть запрос:
Код:
SELECT news_item.* FROM news_item
WHERE news_item.date_start <= 1170409732
AND news_item.date_end >=1170409732
ORDER BY news_date DESC
LIMIT 0,5
Индекс date при таком запросе не используется. Если поле news_date в индексе поставить первым - используется, но не помогает в ограничении размера выборки, идет сканирование всей таблицы.
Первоначальный индекс используется, если иметь явные сравнения с date_start и date_end, но мне нужно выбирать только up-to-date новости.
В общем-то мотивы, по которым MYSQL отказывается использовать индекс, мне понятны.
В итоге - мне придется применить условие news_item.date_start <=1170409732 AND news_item.date_end >=1170409732 - отдельно:
1) или отдельным запросом(подзапросом)
2) или создать поле is_up_to_date и заполнять его вне основного приложения, например, раз в день по cron