позиция индекса в ORDER BY (позиция в рейтинге) - PullRequest
0 голосов
/ 03 мая 2020

У меня есть таблица врагов, одно из полей называется «Сила». У меня есть сила как индекс.

Чтобы перечислить врагов, основанных на силе, я бы использовал

SELECT * FROM enemies ORDER BY Power DESC

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

что-то вроде :

enemy1 1111 
enemy2 1100 
... 
enemysearched 1000 
enemyn1 995 
.....

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

Это так? можно без чтения полной таблицы?

1 Ответ

0 голосов
/ 03 мая 2020

... Я хочу показать для определенного врага позицию, основанную на силе.

Чтобы найти позицию, которую вы можете сделать:

select count(*) + 1
from enemies e 
join enemies f on f.power < e.power
where e.id = 1000 -- the base enemy

This В запросе будет выполнена операция «Сканирование диапазона индекса», поэтому она должна выполняться быстрее, чем чтение таблицы. Тем не менее, если в таблице много строк, это может занять много времени.

Также я хочу показать пять врагов, которые находятся выше и ниже этого значения ...

Вы можете сделать:

select f.*
from enemies e 
join enemies f on f.power < e.power
where e.id = 1000 -- the base enemy
order by f.power desc
limit 5
union all
select f.*
from enemies e 
join enemies f on f.power > e.power
where e.id = 1000 -- the base enemy
order by f.power
limit 5

Этот запрос выполнит два сканирования диапазона индекса . Оба должны быть довольно быстрыми все время, так как каждый будет читать 5 строк максимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...