一列,两列或两者的索引?

时间:2013-03-24 00:39:57

标签: mysql sql

假设我有一个简单的表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

正如您所看到的,前两个查询很好地使用了索引,但后两个查询没有。

我正在考虑在dateearnings上创建一个索引,但由于date已经在索引中,因此感到很奇怪。这是正确的解决方案吗?

如果没有,那么索引此表的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  

我在考虑创建一个关于日期,收益的指数但是因为日期已经在索引中而感到很奇怪。

可以根据需要在多个索引中包含相同的列。在date,earnings上创建索引绝对可以,但date上的单个索引也可能就足够了。您还可以考虑单独索引dateuser_id,并查看第二个查询是否在大致相同的时间内执行(它应该)。

答案 1 :(得分:0)

这取决于日期谓词结果的数据大小。如果它很大(数千条记录),那么ORDER BY可以从收益指数中获益很大。如果它相对较小,那么你可能没有从索引中看到太多的好处,事实上,如果在这个表上经常发生这种情况,你可能会对插入,更新和删除造成损害。

在您的示例中,只有date的谓词,(user_id, date)的复合主键对您没有好处,因为复合键索引从左到右工作,这意味着有索引外观在user_iduser_id, date上,但不是date

偏离主题,但float不是货币的良好数据类型。