Как оптимизировать поиск наиболее часто встречающихся значений (сотни миллионов строк) - PullRequest
3 голосов
/ 07 сентября 2011

Я пытаюсь получить некоторые наиболее часто встречающиеся значения из таблицы SQLite, содержащей несколько сотен миллионов строк.

Запрос пока может выглядеть так:

SELECT value, COUNT(value) AS count FROM table GROUP BY value ORDER BY count DESC LIMIT 10

В поле value есть индекс.

Однако с предложением ORDER BY запрос занимает так много времени, что я никогда не видел его конца.

Что можно сделать, чтобы радикально улучшить такие запросы для такого большого объема данных?
Я попытался добавить предложение HAVING (например, HAVING count> 100000), чтобы уменьшить количество сортируемых строк, но безуспешно.

Обратите внимание, что меня не волнует время, необходимое для выполнения вставки (оно все еще должно быть разумным, но приоритет отдается выбору), поэтому я открыт для решений, предлагающих вычисления во время вставки. .

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

1) создайте новую таблицу, в которой вы будете хранить одну строку для каждого уникального «значения» и «счетчика», поместите нисходящий индекс в столбец подсчета
2) добавьте триггер к исходной таблице, где вы ведете эту новую таблицу (вставку и обновление) по мере необходимости для увеличения / уменьшения счетчика.
3) запустите ваш запрос из этой новой таблицы, которая будет выполняться быстро из-за индекса по убыванию

1 голос
/ 07 сентября 2011

этот запрос заставляет вас просматривать каждую строку в таблице.это то, что отнимает время.

Я почти никогда не рекомендую это, но в этом случае вы можете поддерживать денормализованный счет во внешней таблице.

поместите значение и рассчитайте вдругая таблица во время вставки, обновления и удаления с помощью триггеров.

...