2013-03-24 74 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