【问题标题】:Choosing the right database index type选择正确的数据库索引类型
【发布时间】:2017-07-30 18:30:38
【问题描述】:

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

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

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

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

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

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

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

谁能推荐我这种情况下最好的索引类型或最快的查询来检查用户是否存在?或者也许 MongoDB 不是最适合这个的?

【问题讨论】:

    标签: mongodb database-design database


    【解决方案1】:

    先随便想想:

    • text 索引用于帮助full text search。鉴于您的描述,这不是这里需要的,因为如果我理解得很好,您需要使用整个字段的 exact 匹配。
    • 没有任何索引,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。这是一个有序索引,可以防止插入两个相同的文档。

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

    【讨论】:

    • 感谢您的回答和解释。我什至没有想过只是尝试插入,但这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2012-09-26
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多