选择正确的数据库索引类型

时间:2015-05-09 16:41:11

标签: mongodb database-design database

我有一个非常简单的Mongo数据库用于个人nodejs项目。它基本上只是注册用户的记录。

我最重要的字段是一个字母数字字符串(让我们称之为user_id,并假设它只能是数字),大约15到20个字符。

现在最重要的操作是检查用户是否存在。我这样做是通过查询db.collection.find("user_id": "testuser-123")

来完成的

如果没有记录返回,我会保存用户以及其他一些不太重要的数据,如名字,姓氏和注册日期。

现在我显然想让user_id成为一个索引。 我在official MongoDB Manual上阅读了索引教程。

首先我尝试设置text index,因为我认为这符合字母数字字段。我也尝试过设置language:none。但事实证明,我的查询在大约12毫秒内返回,而不是在没有索引的情况下返回6毫秒。

然后我尝试设置一个有序的索引,如{user_id: 1},但我没有看到任何差异(它是否只适用于数值?)。

任何人都可以向我推荐此案例的最佳索引类型或最快查询以检查用户是否存在?或者MongoDB可能不是最适合的?

1 个答案:

答案 0 :(得分:1)

首先是一些随意的想法:

  • text 索引用于帮助full text search。鉴于你的描述,这不是这里所需要的,因为如果我理解得很好,你需要使用整个领域的完全匹配。
  • 没有任何索引,MongoDB将使用线性搜索。使用big O notation,这是 O(n)操作。使用(有序)索引,搜索在 O(log(n))中执行。这意味着当您拥有许多文档时,索引将大大加快查询速度。但是如果你有少量文件,你就没有必要看到任何改进。 In that case, O(n) can even be worst than O(log(n))。如果优化器估计它将无法提供足够的好处,则某些数据库管理系统甚至不会使用索引。我不知道MongoDB是否会这样做。

根据您的用例,我认为正确的索引是unique index。这是一个有序的索引,可以防止插入两个相同的文档。

在您的应用程序中,在插入之前不进行测试。在实际应用中,当您有并发插入时,这可能会导致竞争条件。如果您使用唯一索引,只需尝试插入 - 并准备好优雅地处理由重复键引起的错误。