Php 大表的最快行秩

Php 大表的最快行秩,php,mysql,sql,database,Php,Mysql,Sql,Database,信息:我有这张桌子 该表由2500万行组成,每天增长0.25万行。分数分布约为0到300分,表格中85%的分数为0分 问题:如果用户得到至少1分,我想返回到他/她拥有的排名。在SQL、PHP或两者结合的情况下,最快的方法是如何实现的 额外信息:这些查找每秒可能发生100次。到目前为止,我看到的解决方案还不够快,如果需要更多信息,请询问 欢迎您提供任何建议,因为您知道我是PHP和MySQL新手:在tpoints和tperson_id上创建索引,points。然后运行以下查询: select cou

信息:我有这张桌子

该表由2500万行组成,每天增长0.25万行。分数分布约为0到300分,表格中85%的分数为0分

问题:如果用户得到至少1分,我想返回到他/她拥有的排名。在SQL、PHP或两者结合的情况下,最快的方法是如何实现的

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

欢迎您提供任何建议,因为您知道我是PHP和MySQL新手:

在tpoints和tperson_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;
这只确保对给定人员的点进行一次查找,而不是对每一行进行查找。

在tpoints和tperson_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;
这只是确保查找给定人员的点只发生一次,而不是每行

您的表分为两个分区—一个分区用于得分为0的人,另一个分区用于得分为一个或多个的人。 如果这些索引不存在,请在表中添加一个点索引,并在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 = ?
要查找特定人员的非密集级别,请运行查询:

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 = ?
我希望密集排名查询运行得更快

您的表分为两个分区—一个分区用于得分为0的人,另一个分区用于得分为一个或多个的人。 如果这些索引不存在,请在表中添加一个点索引,并在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 = ?
要查找特定人员的非密集级别,请运行查询:

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 = ?

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

您没有提供足够的用例信息。为什么需要PHP来做这件事?这是一个简单的MySQL语句,除非您指的是性能问题。更常见的是,给用户排名还是插入新行?大约是多少比例?对不起,我对MySQL很陌生,现在将为问题添加更多信息。在0分以上,比如1到10分,你会得到什么样的分数分布?你没有提供足够的用例信息。为什么需要PHP来做这件事?这是一个简单的MySQL语句,除非您指的是性能问题。更常见的是,给用户排名还是插入新行?大约是多少比例?对不起,我对MySQL还不太熟悉,现在会给这个问题添加更多的信息。0分以上,比如1到10分,你会得到什么样的分数分布?谢谢+1,效果很好,但是Gordon的查询只是有点快Hanks+1,效果很好,但是Gordon的查询只是快了一点