2013-05-20 71 views
3

在我的MySQL數據庫中,我有一個表(人)有超過1000萬行,這兩個重要的欄目有:使用百分比選擇獲得行數的最快方法(限制X,1)?

  • ID

我想知道的排名身份證號碼= randomid

我想返回到他的「等級」,這取決於他的觀點。 他的排名不會是確切的行號,但更像是一個百分比層。就像:「你處於前5%」或「你處於10%-15%的層次」。

當然,我可以查詢表並通過將行號除以行總數將行號轉換爲圖層%。但我的問題是,它會更快(10M +行),只需用LIMIT X,1獲取多行,其中X將成爲表中百分比爲100,95,90,85的一行。下一步:檢查這一行的點數是否低於當前點數,如果是,抓取下一層%行,如果沒有,則返回上一層數據行。

在人表中有9列2個bigint,4個varchars 150,1個日期和2個布爾值。

當然,我寧願得到確切的排名,但從我測試的結果來看,這很慢,至少需要幾秒鐘,而我的wat可以在幾百秒內完成。

另外,我提出的方式在多個圖層具有相同的點時並不精確,但它不需要精確,所以我們可以忽略這一事實。

額外的信息,我在PHP程序,所以如果在PHP + MySQL中有一個特定的解決方案,這將是很好。

最後,值得一提的是,表格每小時增長20k行(每天近500k行)。

感謝您閱讀本文,我感謝所有幫助。 Kevin

+0

這似乎是關於mysql和百分位的問題。我對嗎? – Strawberry

+0

是的,我是指百分位數。 :) –

回答

0

你可以試試這個。我首先計算更多點的行數,然後再添加一個,以防萬一點數相同的行數。因此,如果有10行具有相同數量的點,則它們的排名與該組中的第一排相同。

SELECT SUM(CASE WHEN points > (SELECT POINTS FROM YOUR_TABLE WHERE ID = randomid) THEN 1 ELSE 0 END) + 1 as Rank, 
     (SUM(CASE WHEN points > (SELECT POINTS FROM YOUR_TABLE WHERE ID = randomid) THEN 1 ELSE 0 END) + 1)/COUNT(*) as Pct 
FROM YOUR_TABLE 

如果這很慢,我會運行兩個查詢。首先獲取該ID的點數,然後將其插入到第二個查詢中以確定排名/ pct。

SELECT POINTS 
FROM YOUR_TABLE 
WHERE ID = randomid 

然後計算等級和pct,插入上面的點。

SELECT SUM(CASE WHEN points > POINTS THEN 1 ELSE 0 END) + 1 as Rank, 
     (SUM(CASE WHEN points > POINTS THEN 1 ELSE 0 END) + 1)/COUNT(*) as Pct 
FROM YOUR_TABLE 
+0

Pct正是我所說的百分比計算。你可以稱它爲任何東西。 – Tom

+0

在具有600k行的測試臺上,它非常快,0.3秒。這真的很好。這個解決方案比用rowcounts選擇更快嗎?我對SQL很陌生,所以我不完全理解你的查詢:) –

+0

我是新來的stackoverflow,以便你知道。 –