2

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

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

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

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

4

2 回答 2

1

我正在考虑创建一个关于日期、收入的索引,但因为日期已经在索引中,所以对此感到很奇怪。

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

于 2013-03-24T00:47:32.817 回答
0

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

在您的示例中,您有一个谓词 only date,复合主键 of(user_id, date)不会使您受益,因为复合键索引从左到右工作,这意味着在 and 上有一个索引查找user_iduser_id, date但不是date单独的。

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

于 2013-03-24T00:48:36.207 回答