Я хочу сгруппировать рейтинг на очень большой таблице, я нашел пару решений для этой проблемы, например. в this post и других местах в Интернете. Однако я не могу понять сложность этих решений в худшем случае. Конкретная проблема состоит из таблицы, в которой каждая строка имеет несколько точек и ассоциированное имя. Я хочу иметь возможность запрашивать ранговые интервалы, такие как 1-4. Вот некоторые примеры данных:Рейтинг в MySQL, как мне получить максимальную производительность при частых обновлениях и большом наборе данных?
name | points
Ab 14
Ac 14
B 16
C 16
Da 15
De 13
С этими значениями следующего «рейтингом» создано:
Query id | Rank | Name
1 1 B
2 1 C
3 3 Da
4 4 Ab
5 4 Ac
6 6 De
И это должно быть возможно создать следующий интервал на запрос-идентификаторы: 2-5 Давать ранг: 1,3,4 и 4.
В базе данных хранится около 3 миллионов записей, поэтому, если возможно, я хочу избежать решения со сложностью, большей, чем log (n). В базе данных постоянно обновляются и вставляются данные, поэтому эти действия предпочтительно должны выполняться с учетом сложности log (n). Я не уверен, что это возможно, хотя и я пробовал обернуть вокруг себя его в течение некоторого времени. Я пришел к выводу, что бинарный поиск должен быть возможен, но я не смог создать запрос, который делает это. Я использую сервер MySQL.
Я расскажу о том, как может работать псевдокод для фильтрации. Во-первых, необходим индекс (точки, имя). В качестве вклада вы получаете fromrank и tillrank. Общее количество записей в базе данных - n. Псевдокод должен выглядеть примерно так:
Найти медианное значение, подсчитать строки меньше этого значения (граф дает приблизительную оценку ранга, не считая тех, у кого одинаковое количество очков). Если возвращаемое число больше, чем разделитель fromrank, мы разделяем первую половину и находим ее медиану. Мы продолжаем делать это до тех пор, пока не будем указаны количество очков, на которых должен начинаться запуск. то мы делаем то же самое в пределах этого количества пунктов с индексом имени и находим медианный, пока не достигнем правильной строки. Мы делаем то же самое для доранка.
В результате должно быть log (n) количество подразделений. Поэтому, учитывая, что медиана и счет могут быть сделаны в log (n) времени, должно быть возможно решить проблему в наихудшем случае log (n). Поправьте меня, если я ошибаюсь.
Рад, что мое сообщение пригодилось. Вы пробовали второе решение? Использование group_concat? – achinda99
Я думаю, что метод имеет сложность n, если я не ошибаюсь, кроме того, я не вижу, как его можно легко модифицировать, чтобы поддерживать выбор любого диапазона рангов. –
К сожалению, сам счет является самой дорогостоящей операцией здесь, время будет зависеть от фактически подсчитанных строк, а не от искомых строк, так что все равно будет O (N) – Quassnoi