索引两列表的所有字段

时间:2012-10-25 14:00:47

标签: mysql mongodb indexing database-design database

我有一个表/架构,其中两列名为 DateTime user_id 整数。知道我把两列都编入索引。

索引的性能改进是否值得,考虑到索引使用的大量额外空间而且只有两列?你怎么为他们辩护?

如果我使用MongoDB或MySQL,这有何不同?

2 个答案:

答案 0 :(得分:2)

如果行数很少,您可能看不到索引的重大改进。如果有很多行,你可能会看到很大的改进。

好消息是你不必猜测,并且你不必为实践中少数许多的含义而苦恼。每个现代SQL dbms都包含一些衡量SELECT语句性能的方法。这包括MySQL。

答案 1 :(得分:1)

  

索引的性能改进值得吗?

取决于您打算运行的查询。

  • 如果你有类似WHERE day = ...的内容,那么你需要一个前沿包含day的索引。如果使用得当,索引可以加速查询许多数量级,特别是在大型数据集上。
  • OTOH,每个额外的索引都需要空间/缓存和INSERT / UPDATE / DELETE性能。

在一天结束时,我建议您衡量关于实际数据量并得出您自己的结论。

BTW,如果您使用的是InnoDB,那么您的表格为clustered(另请参阅:Understanding InnoDB clustered indexes),整个表格实际存储在主索引中。群集表中的二级索引包含PK字段的副本,在这种情况下(我假设)是user_id。由于表中只有两个字段,{day}上的二级索引也会覆盖user_id,从而避免了在群集表中可能发生的双重查找。实际上,无论您访问哪一个(哪个好),您最终都会得到两个独立的(但已同步的)B树和一个index-only scan。当然,您可以在{dayuser_id}而不仅仅是{day}上明确制作综合索引,效果非常相似。