2011-05-06 73 views
46

我不明白pymongo中create_indexensure_index之间的区别。在MongoDB indexes page,它说Pymongo/MongoDB:创建索引或确保索引?

您可以通过调用 ensureIndex()

但是在pymongo有两个不同的命令create_indexensure_index创建索引,并为创建索引的文档有:

与create_index()不同,它尝试 无条件地创建索引, ensure_index()利用驱动程序内的某些 缓存,使其 只尝试创建 可能尚不存在的索引。当PyMongo创建(或确保)索引 时, 在ttl秒内“记住”。 重复呼叫ensure_index() 在该时间限制内将是 轻量级 - 他们不会尝试 实际上创建索引。

我说得对不对公众在理解时ensure_index将创建一个永久索引,或者我需要使用create_index这个?

+0

在mongo 3.x中ensureIndex是** [不建议](http://stackoverflow.com/a/30314946/1090562)**,因此最好停止使用它。即使你仍然使用2.6版本,最好事先做好准备,并确保在未来的迁移中会有更少的意外。 – 2015-05-19 00:40:16

回答

13

请记住,在蒙戈3.X ensureIndex已被弃用,应该气馁。

自3.0.0版开始不推荐使用:db.collection.ensureIndex()现在是db.collection.createIndex()的别名。

同样是pymongo

弃用 - 确保在此集合存在的指标。

这意味着您应该始终使用create_index

3

全部索引是永久性的。 ensure_index()只是create_index()的一个小包装。

“”“ 的ensureIndex()函数只创建索引,如果它不存在。 ‘’”

有没有像一个短暂的索引或临时索引。

+1

我认为这不太对。从mongodb shell调用'ensureIndex()'只会创建一个索引(如果它不存在)。但据我所知,从python接口调用'ensure_index()'方法将创建一个索引*或重建它,如果它最近没有创建*。 – 2011-11-04 18:53:58

38

@安德烈亚斯荣就在那ensure_index()是一个包装过create_index(),我觉得产生了困惑与短语:

当创建了索引(或保证) 通过PyMongo是“记忆“为ttl 秒。

这并不是说该指数是暂时的还是“暂时”,什么情况是,在指定的秒数,以ensure_index()呼叫试图创造同一指数再次将有任何影响,将期间不是下面调用create_index(),但在“缓存”过期后,拨打ensure_index()再次呼叫create_index()下面。

我完全理解你的困惑,因为坦率地说,PyMongo的文档不会在解释它是如何工作做了很好的工作,但如果你头部到Ruby docs,对此的解释是略知一二:

  • (字符串)ensure_index(规格,选择采用= {})

呼叫CREATE_INDEX并设置一个标志,以 不是另一个X分钟再次这样做。 这时候可以初始化蒙戈:: DB 对象作为选择,当被指定为一个 选项[:cache_time的任何 变化为指标将通过以下将会传播 不管缓存时间 (例如,指数方向的改变)

此 方法的参数和选项与 Collection#create_index的参数和选项相同。

实例:

Call sequence:

Time t: @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and sets the 5 minute cache

Time t+2min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- doesn't do anything

Time t+3min : @posts.ensure_index([['something_else', Mongo::ASCENDING]) -- calls create_index and sets 5 minute cache

Time t+10min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and resets the 5 minute counter

我没有声称司机工作完全一样,只是为了说明目的他们的解释是一个更好的恕我直言。

9

交互式shell中的ensureIndex方法和python驱动程序中的ensure_index是不同的东西,虽然使用了相同的单词。 Python驱动程序中的create_indexensure_index方法都会永久创建索引。

也许人们会在这种情况下使用ensure_index合理的TTL,因为我不确定create_index是否每次调用它时都会重新创建索引。通常不需要休闲娱乐,这可能是一项沉重的操作。但是,即使ensure_index(python或ruby驱动程序)也可能在TTL过期时或者从不同客户端实例或重新启动后调用它时重新创建索引。我不确定这一点。

也许更好的可能性是首先使用方法index_information()检查索引是否已经存在。如果它已经存在,则不会再创建它。

我现在演示术语ensure_index(或ensureIndex)如何使用两个不同的含义:

1),如果它不存在于数据库中

这是存在创建索引什么交互Shell方法ensureIndex()做:

http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics

另外,Node.JS MongoDB Driver的行为是这样的:(文件collection.js在搜索function ensureIndex

https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

2)创建索引,如果它不是在 '驱动缓存'

这里使用了相同的标识符和不同的含义,这让我感到困惑。

python和ruby驱动程序将关于最近创建的索引的信息存储在内存中,他们称这种行为为“缓存”。

他们不告诉数据库有关此缓存。

这一机制的结果是,如果你打电话create_indexensure_index首次与TTL值(生存时间),那么驱动程序将插入数据库索引并会记住这个插入并存储内存中的TTL信息。这里缓存的是时间和索引。

你打电话ensure_index与同一驱动程序实例相同集合的相同指数下一次,该ensure_index命令只会再次插入索引,如果TTL秒尚未自第一次调用传递。

如果您致电create_index,索引将始终插入,无论第一次呼叫后经过多少时间,当然如果这是第一次呼叫。

这是Python的驱动程序,搜索def ensure_index文件collection.py在:

https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py

而且Ruby驱动程序,文件collection.rb在搜索def ensure_index

https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb

(请注意,不同的客户端实例不知道其他人的缓存,这些信息保存在mem中ory而且它是每个实例。如果您重新启动客户端应用程序,则新实例不知道旧的“缓存”索引插入。也有其他客户不知道,他们不会告诉对方。)

我还不能完全理解,当数据库中发生什么,当python驱动程序或红宝石驱动程序插入已经存在的索引。我怀疑他们在这种情况下什么都不做,这更有意义,并且也会匹配Interactive Shell和JS驱动程序的行为。

0

我会建议创建元类和ORM。 从元类初始化呼叫init_schema方法用于初始化计数器,模式键等 这样,可以防止调用ensure_index每个查询或集合更新:)