2013-05-21 50 views
0

信息:我有這個表(人士):最快的MySQL排秩

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

表包括25M行且一天增長0.25M。分數的分佈約爲0-300分,表的85%有0分。

問題:我想返回給用戶,如果他們得到至少1分,他/她有哪些等級。如何以及在哪裏將是最快的方式做到這一點,在SQLPHP組合

額外的資訊:那些查找可以每秒100次發生。我目前看到的解決方案速度不夠快,如果需要更多信息,請詢問。

任何意見是值得歡迎的,因爲你知道我是新來的PHP和MySQL :)

+0

你是不是給你的使用情況下足夠的信息。爲什麼你需要PHP來做到這一點?這是一個簡單的MySQL語句,除非您指的是性能問題。 – thatidiotguy

+1

什麼是更頻繁的,排名用戶或插入新行?在什麼比例? –

+0

對不起,我對MySQL相當陌生,現在會給這個問題增加一些更多的信息。 –

回答

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; 

這只是確保了對於給定的人點的查找發生一次,而不是每行。

+0

非常感謝:)工程作爲魅力 –

1
  1. Partition將您的表分成兩個分區 - 一個用於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 = ? 

(我希望茂密排名查詢顯著更快地運行。)

+0

感謝+1,做工不錯,但戈登的查詢只是一個快一點 –