假设我有一个简单的表user_id
(INT),date
(DATE)和earnings
(FLOAT)。我正在尝试决定如何索引此表。
目前,我将PRIMARY键设置为user_id
,date
。
但并非所有查询都使用此密钥。我在下面粘贴了一些示例查询。所有这些都经常运行。
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 :(得分:1)
我在考虑创建一个关于日期,收益的指数但是因为日期已经在索引中而感到很奇怪。
可以根据需要在多个索引中包含相同的列。在date,earnings
上创建索引绝对可以,但date
上的单个索引也可能就足够了。您还可以考虑单独索引date
和user_id
,并查看第二个查询是否在大致相同的时间内执行(它应该)。
答案 1 :(得分:0)
这取决于日期谓词结果的数据大小。如果它很大(数千条记录),那么ORDER BY
可以从收益指数中获益很大。如果它相对较小,那么你可能没有从索引中看到太多的好处,事实上,如果在这个表上经常发生这种情况,你可能会对插入,更新和删除造成损害。
在您的示例中,只有date
的谓词,(user_id, date)
的复合主键对您没有好处,因为复合键索引从左到右工作,这意味着有索引外观在user_id
和user_id, date
上,但不是date
。
偏离主题,但float
不是货币的良好数据类型。