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

Choosing the right database index type

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

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

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

来做到这一点

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

现在我显然想使 user_id 成为索引。 我在 official MongoDB Manual.

上阅读了索引教程

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

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

任何人都可以向我推荐这种情况下最好的索引类型或检查用户是否存在的最快查询吗?或者也许 MongoDB 不是最适合这个的?

首先是一些随机的想法:

  • 一个text索引用来帮助full text search。根据您的描述,这不是这里所需要的,因为,如果我理解得很好,您需要使用整个字段的 exact 匹配。
  • 没有任何索引,MongoDB 将使用线性搜索。使用 big O notation, this is an O(n) operation. With an (ordered) index, the search is performed in O(log(n)). That means that an index will dramatically speed up queries when you will have many documents. But you will not necessary see any improvement if you have a small number of documents. In that case, O(n) can even be worst than O(log(n))。如果优化器估计它不会提供足够的好处,一些数据库管理系统甚至不会费心使用索引。不过,我不知道 MongoDB 是否会这样做。

鉴于您的用例,我认为合适的索引是 unique index。这是一个有序索引,可以防止插入两个相同的文档。

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