camka
не самка
Оптимизировать запрос из одной таблицы.
Когда-то давно уже задавался этим вопросом в этом же форуме, но идеального решения не нашел. Да еще со временем значитально выросло количество данных в базе. И проблема всплыла снова.
Запрос:
[sql]
select query, sum(hits) as hits
from stat_fastsearch
where
engine in(1,2,3,4,5,6,7,8,9,10,11,12)
and id between 20040501 and 20050501
group by query
order by hits desc
limit 1000;
[/sql]
где stat_fastsearch - это таблица ежедневной статистики поиска фраз на разный страницах сайта.
[sql]
CREATE TABLE `stat_fastsearch` (
`id` int(11) NOT NULL default '0',
`query` int(11) NOT NULL default '0',
`engine` int(11) NOT NULL default '0',
`hits` int(10) unsigned default NULL,
KEY `id` (`id`),
KEY `engine_id` (`engine`,`id`),
KEY `query` (`query`),
) TYPE=MyISAM
[/sql]
id - это не первичный ключ, а, как ни странно, дата по которой собирается статистика
query - это идентификатор искомой фразы, ссылающийся на другую таблицу
engine - идентификатор страницы, на которой искали фразу
hits - количество раз, когда искалась данная фраза в указанный день на определенной странице.
Вышеописанным запросом выбирается топ самых частоискомых фраз для выбранных страниц за заданный период времени.
Строк в таблице с пол миллиона. Проблема в группировке и сортировке. Запрос выполняется ок. 10 секунд. Обычно используется индекс engine_id, когда фильтруется по условиям в where, но когда в выборку входят все страницы, может использоваться и индекс id. Хотелось бы как-то избавиться от using temporary и using filesort. Пробовал всевозможные комбинации индексов, но как-то значительно оптимизировать скорость не удалось.
Когда-то давно уже задавался этим вопросом в этом же форуме, но идеального решения не нашел. Да еще со временем значитально выросло количество данных в базе. И проблема всплыла снова.
Запрос:
[sql]
select query, sum(hits) as hits
from stat_fastsearch
where
engine in(1,2,3,4,5,6,7,8,9,10,11,12)
and id between 20040501 and 20050501
group by query
order by hits desc
limit 1000;
[/sql]
где stat_fastsearch - это таблица ежедневной статистики поиска фраз на разный страницах сайта.
[sql]
CREATE TABLE `stat_fastsearch` (
`id` int(11) NOT NULL default '0',
`query` int(11) NOT NULL default '0',
`engine` int(11) NOT NULL default '0',
`hits` int(10) unsigned default NULL,
KEY `id` (`id`),
KEY `engine_id` (`engine`,`id`),
KEY `query` (`query`),
) TYPE=MyISAM
[/sql]
id - это не первичный ключ, а, как ни странно, дата по которой собирается статистика
query - это идентификатор искомой фразы, ссылающийся на другую таблицу
engine - идентификатор страницы, на которой искали фразу
hits - количество раз, когда искалась данная фраза в указанный день на определенной странице.
Вышеописанным запросом выбирается топ самых частоискомых фраз для выбранных страниц за заданный период времени.
Строк в таблице с пол миллиона. Проблема в группировке и сортировке. Запрос выполняется ок. 10 секунд. Обычно используется индекс engine_id, когда фильтруется по условиям в where, но когда в выборку входят все страницы, может использоваться и индекс id. Хотелось бы как-то избавиться от using temporary и using filesort. Пробовал всевозможные комбинации индексов, но как-то значительно оптимизировать скорость не удалось.