首页 > 解决方案 > ORDER BY 中的索引位置(排名位置)

问题描述

我有一个表敌人,其中一个字段是一个名为“Power”的字段。我有权力作为指标。

列出基于权力的敌人,我会使用

SELECT * FROM enemies ORDER BY Power DESC

现在我想向某个敌人展示基于权力的立场。此外,我想展示超过和低于该值的五个敌人....但我不想读取所有寄存器,直到我感兴趣的那个(数百万个寄存器)。

就像是:

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

一种选择是生成一个排名列并经常计算它,但我只想知道是否有可能仅使用 mysql 以良好的速度。

是否可以不阅读完整表格?

标签: mysqlmariadb

解决方案


...我想向某个敌人展示以权力为基础的地位。

要找到您可以执行的职位:

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

此查询将执行 *Index Range Scan" 引擎操作,因此它应该比读取表更快。如果表中有很多行,它仍然可能很耗时。

我还想展示超过和低于这个值的五个敌人......

你可以做:

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

此查询将执行两次Index Range Scan。两者都应该一直非常快,因为每个都最多读取 5 行。


推荐阅读