2014-05-02 42 views
1

我使用mysql進行遊戲。我有大約150,000條記錄的分數表。該表看起來像:排行榜排名計數聲明的成本?

fk_user_id | high_score 

high_score列是一個int。它有一個索引。我想通過運行以下弄清楚用戶的排名:

SELECT COUNT(*) AS count FROM scores WHERE high_score >= [x] 

因此提供用戶的當前high_score上面,我可以讓他們的排名。這個想法是,每當用戶查看個人資料頁面時,我都會運行上述內容以獲得排名。

我想知道這是多麼昂貴,如果我甚至應該走這條路。每次發出查詢時,mysql是否掃描整個表?這是一個瘋狂的想法嗎?

更新:這裏是 '解釋' 說,有關查詢:

ID:1個

SELECT_TYPE:SIMPLE

表:分數

類型:範圍

possible_keys:high_score

鍵:high_score

key_len:5

參照:空

行:1

額外:使用其中;使用索引

感謝

+0

可以運行在MySQL下'解釋SELECT COUNT(*)AS數量FROM成績WHERE high_score> = [X]'和scores'共享的結果除了還'顯示的索引,並添加結果到你的問題。 –

+0

DESC訂單是否爲high_score上的索引?它可能會提高性能。 –

+0

@JosephB沒有索引不是DESC順序,我可以考慮這樣做。 – user3203425

回答

0

MySQL正在掃描您要求它返回的每條記錄的整個表。

爲什麼要用count(*)你不能使用count(distinct User_ID)count(user_ID)

您應該已經是列索引,我敢肯定,它會準確地返回結果。

SELECT COUNT(distinct user_ID) AS count FROM scores WHERE high_score >= [x]

+0

嗨,我恐怕我沒有遵循 - 你可以顯示你建議我切換到的完整聲明,因爲問題中的表名+ col名? – user3203425

+0

在答案中看到更新的陳述。 – Hituptony

+0

好吧,我測試過了,就像你說的那樣。但爲什麼它比使用(\ *)更有效?爲什麼要(\ *)掃描整個表格? – user3203425

0

如果high_score是指數,那麼成本就比較小,如果沒有 - 那麼全表掃描而成。

相對較小 - 只需從鑰匙讀取rowid並對它們進行計數 - 成本非常低。

你總是可以寫explain,然後查詢來檢查數據庫是否準確地提取你的數據。