我有一个表/模式,其中有两列名为day的DateTime和user_id的Integer。知道我把两列都编入索引了。
考虑到索引使用的额外空间的很大一部分并且只有两列,从索引中获得的性能改进是否值得?你如何为他们辩护?
如果我使用 MongoDB 或 MySQL,这有什么不同?
我有一个表/模式,其中有两列名为day的DateTime和user_id的Integer。知道我把两列都编入索引了。
考虑到索引使用的额外空间的很大一部分并且只有两列,从索引中获得的性能改进是否值得?你如何为他们辩护?
如果我使用 MongoDB 或 MySQL,这有什么不同?
从索引中获得的性能改进是否值得
取决于您打算运行的查询。
WHERE day = ...
,那么你需要一个索引,其前沿包含day
. 如果使用得当,索引可以将查询速度提高许多数量级,尤其是在大型数据集上。归根结底,我建议您根据实际数据量进行衡量并得出自己的结论。
顺便说一句,如果您使用 InnoDB,那么您的表是聚集的(另请参阅:了解 InnoDB 聚集索引)并且整个表有效地存储在主索引中。聚集表中的二级索引包含 PK 字段的副本,(我假设)user_id
在这种情况下。由于我们在表中只有两个字段,因此 { day
} 上的二级索引也将覆盖它们user_id
,从而避免在聚集表中可能发生的双重查找。实际上,无论您访问其中哪一个(这很好),您最终都会得到两个独立(但同步)的 B 树和一个仅索引扫描。当然,您可以在 { day
, user_id
} 上显式创建复合索引,而不仅仅是 {day
},以获得非常相似的效果。