2013-03-24 39 views
1

假設我有一個簡單的表user_id(INT),date(DATE)和earnings(FLOAT)。我正在試圖決定如何索引這張表。一列,兩列或兩者的索引?

目前,我的PRIMARY鍵設置爲user_iddate

但並非所有查詢都使用此密鑰。我在下面粘貼了一些示例查詢。所有這些都經常運行。

SELECT SUM(earnings) FROM stats WHERE user_id=? //Get total earnings 
SELECT SUM(earnings) FROM stats WHERE user_id=? AND date between ? AND ? //Get earnings for date range 

SELECT user_id FROM stats WHERE date=$today ORDER BY earnings DESC LIMIT 0,5 //Get todays highest earners 
SELECT user_id FROM stats WHERE date>$month ORDER BY earnings DESC LIMIT 0,5 //Get months highest earners 

正如你所看到的,上面兩個查詢使用索引很好,但後兩個沒有。

我正在考慮在date,earnings上創建一個索引,但由於date已經在索引中,所以感覺很奇怪。這是正確的解決方案嗎?

如果不是,索引此表的最佳方法是什麼?

回答

0

我正在考慮在日期,收益上創建索引,但由於日期已經在索引中,所以感覺很奇怪。

根據需要在多個索引中包含相同的列是可以的。在date,earnings上創建索引肯定是可以的,但date上的單個索引也可能就足夠了。您還可以考慮分別編制dateuser_id索引,並查看第二個查詢是否在大致相同的時間(應該)執行。

+0

user_id和date必須一起保留至少一個唯一索引。感謝你的回答! – hellohellosharp 2013-03-24 01:04:55

0

這取決於日期謂詞結果的數據大小。如果它很大(成千上萬的記錄),那麼ORDER BY可以從收益指數中大大受益。如果它相對較小,那麼您可能不會從索引中看到太多好處,事實上,如果插入,更新和刪除操作經常發生在這張表上,您可能會對其進行破壞。

在你的榜樣,你有隻date謂詞的(user_id, date)複合主鍵不會因爲複合鍵索引工作,左到右,這意味着有上user_iduser_id, date索引查找有利於你,但不包括date

偏離主題,但float不是貨幣的良好數據類型。

+0

是的,我確實意識到這個關鍵並不適用於所有的查詢,這就是我問的原因。感謝你的回答!什麼是更好的收入數據類型? – hellohellosharp 2013-03-24 01:06:04