MySQL. Есть таблица с новостями, много записей — уже около 70 тыс. и будет расти.
Структура такая:
CREATE TABLE IF NOT EXISTS `news` (<br/>
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,<br/>
`id_section` int(11) NOT NULL,<br/>
`title` varchar(250) NOT NULL,<br/>
`description` text,<br/>
`image` varchar(250) DEFAULT NULL,<br/>
`url` varchar(250) NOT NULL,<br/>
`timestamp` int(10) unsigned NOT NULL,<br/>
`active` tinyint(1) unsigned DEFAULT '1',<br/>
PRIMARY KEY (`id`),<br/>
KEY `id_section` (`id_section`),<br/>
KEY `timestamp` (`timestamp`),<br/>
KEY `title` (`title`),<br/>
KEY `active` (`active`),<br/>
KEY `url` (`url`)<br/>
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=69653 ;
Есть проблема: записи добавляются автоматически таким образом, что одна и та же запись может быть добавлена несколько раз для разных
id_section.
Таким образом при получении данных без указания параметра
id_section (показать новости из всех разделов) вылазят дублирующиеся записи. Причем, как правило, они идут подряд. Это плохо.
На таблице небольшого размера решением был такой запрос:
SELECT `news`.* FROM `news` WHERE (active = 1) GROUP BY `url` ORDER BY `timestamp` desc LIMIT 10 OFFSET 20
Однако, уже сейчас такой запрос выполняется 4-5 секунд (!!!).
Нужно решение, которое позволит выйти на показатель хотя бы 0.5 сек.Примечание: без GROUP BY данный запрос выполняется 0.7 сек. При том, что другие запросы из небольших таблиц занимают микросекунды.
Принимаются любые предложение по оптимизации — не только данного запроса. Возможно есть какие-то специальные приемы для решения подобных задач.