一个“唯一”的MongoDB和批处理插入上的真实索引

时间:2018-10-10 03:56:07

标签: database mongodb nosql

假设我在user_id上创建了一个索引

db.members.createIndex( { "user_id": 1 }, { unique: true } )

我有三个问题:

  1. 使用此"unique": true是否会使批量插入速度变慢?
  2. 这与“ upsert”有何不同?
  3. 当您尝试批量插入包含某些重复项的插入时会发生什么?它会失败并回滚吗?还是只是因为唯一的检查而失败的少数失败?

2 个答案:

答案 0 :(得分:0)

具有这种“独特”的含义:真的会使批量插入速度变慢吗?

  • 维护索引总是会在加快读取速度的同时增加一些写入/更新的开销。特别是对于“独特”:true;它会验证约束,因此它会比常规索引慢一点。但是,如果“ user_id”将是唯一的,那么它是确保它唯一的最佳方法。

这与“ upsert”有什么不同?

  • 我相信这里的问题是,使用“ upsert”运行更新时会发生什么情况?然后,如果存在现有的user_id,则它将被覆盖。

当您尝试批量插入包含某些重复项的插入时会发生什么?它会失败并回滚吗?还是仅仅因为少数人因唯一检查而失败了?

  • 除非设置了“ upsert”:true,否则重复记录将导致“重复记录发现错误”。

答案 1 :(得分:0)

1。拥有“独特”:true会使批处理插入速度变慢吗?

这是一个索引,因此按定义是。插入时,需要验证记录的唯一性。不确定是否需要花太多时间在这个问题上。

2。与“ upsert”有什么不同?

问题是,当您使用1 christmas holiday 1 Easter holiday 1 Friday day 2 Monday day 1 thanksgiving holiday 1 Thursday day 2 Tuesday day 选项进行更新时会发生什么。根据文档:

  

为避免多次插入同一文档,请仅使用upsert:true,如果查询字段为   唯一索引。

     

如果所有update()操作在任何客户端成功插入数据之前完成了查询部分,并且   名称字段上没有唯一索引,则每个更新操作都可能导致插入。   为了防止MongoDB多次插入同一文档,请在   名称字段。

     

使用唯一索引,如果多个应用程序使用upsert发出相同的更新:正确   一个update()将成功插入一个新文档。   其余操作将是:

     

•更新新插入的文档,或

     

•尝试插入重复项时失败。

     

如果操作由于重复的索引键错误而失败,则应用程序可以重试该操作,   将作为更新操作成功。   upsert:true,带有虚线_id查询

3。当您尝试批量插入包含某些重复项的插入时会发生什么?它会失败并回滚吗?还是只是因为唯一的检查而失败的少数失败?

这取决于。如果您将upsert: true选项保留为默认值,则它将使用。但是,如果将其设置为 false

  

如果 ordered 设置为 false ,文档将以无序格式插入,并且mongod可能会对其进行重新排序以提高性能。如果使用无序insertMany(),则应用程序不应依赖于插入的顺序。

,最重要的是,如果在批量ordered期间发生错误:

  

命令设置为 false ,插入操作将继续处理所有剩余文档。

More on Unordered Inserts

More on unique index with upsert:true