0

信息:我有这张桌子():

PERSON_ID   int(10)
POINTS      int(6)
4 OTHER COLUMNS which are of type int(5 or 6)

该表由 2500 万行组成,并且每天增长 025 万。点的分布在 0 到 300 点左右,85% 的表有 0 点。

问题:如果用户至少获得 1 分,我想返回他/她的排名。在SQLPHP组合中,如何以及在哪里是最快的方法?

额外信息:这些查找可能每秒发生 100 次。到目前为止我看到的解决方案还不够快,如果需要更多信息,请询问。

欢迎任何建议,因为你知道我是 PHP 和 MySQL 的新手 :)

4

2 回答 2

3

t(points)在和 上创建索引t(person_id, points)。然后运行以下查询:

select count(*)
from persons p
where p.points >= (select points from persons p where p.person_id = <particular person>)

子查询应使用第二个索引作为查找。第一个应该是对第一个索引的索引扫描。

有时 MySQL 对优化可能有点奇怪。所以,这实际上可能会更好:

select count(*)
from persons p cross join
     (select points from persons p where p.person_id = <particular person>) const
where p.points > const.points;

这只是确保对给定人的点的查找发生一次,而不是针对每一行。

于 2013-05-21T18:07:03.630 回答
1
  1. 将您的桌子分成两个分区- 一个用于有 0 分的人,一个用于有一个或多个积分的人。
  2. 在表的点上添加一个索引,在 person_id 上添加另一个索引(如果这些索引尚不存在)。

要查找特定人员的密集等级,请运行以下查询:

select count(distinct p2.points)+1
from person p1
join person p2 on p2.points > p1.points
where p1.person_id = ?

要查找特定人员的非密集排名,请运行以下查询:

select count(*)
from person p1
join person p2 on p2.points >= p1.points
where p1.person_id = ?

(我希望密集排名查询运行得更快。)

于 2013-05-21T18:22:55.467 回答