python - desinstalar - Pymongo/MongoDB: ¿crear índice o asegurar índice?
python mongodb collection (5)
No entiendo la diferencia entre create_index
y ensure_index
en pymongo. En la página de índices de MongoDB , dice
puede crear un índice llamando a
ensureIndex()
Sin embargo, en pymongo hay dos comandos diferentes create_index
y ensure_index
, y la documentación para crear el índice tiene:
A diferencia de create_index (), que intenta crear un índice incondicionalmente, ensure_index () aprovecha algunas memorias caché dentro del controlador, de modo que solo intenta crear índices que podrían no existir. Cuando PyMongo crea un índice (o lo asegura), es "recordado" durante ttl segundos. Las llamadas repetidas a ensure_index () dentro de ese límite de tiempo serán livianas: no intentarán crear realmente el índice.
¿Estoy en lo cierto al entender que ensure_index
creará un índice permanente, o necesito usar create_index
para esto?
@ andreas-jung tiene razón en que ensure_index()
es un contenedor sobre create_index()
, creo que la confusión surge con la frase:
Cuando PyMongo crea un índice (o lo asegura), es "recordado" durante ttl segundos.
No es que el índice sea temporal o "transitorio", lo que sucede es que durante la cantidad especificada de segundos, una llamada a ensure_index()
tratando de crear el mismo índice nuevamente no tendrá ningún efecto y no llamará a create_index()
debajo, pero luego de que caduque "caché", una llamada a ensure_index()
volverá a llamar create_index()
debajo.
Entiendo perfectamente tu confusión porque francamente los documentos de PyMongo no hacen un buen trabajo al explicar cómo funciona esto, pero si te diriges a los documentos de Ruby , la explicación es un poco más clara:
- (Cadena) ensure_index (spec, opts = {})
Llama a create_index y establece un indicador para que no vuelva a hacerlo durante otros X minutos. esta vez se puede especificar como una opción al inicializar un objeto Mongo :: DB como opciones [: cache_time] Cualquier cambio en un índice se propagará independientemente del tiempo de caché (por ejemplo, un cambio de dirección del índice)
Los parámetros y opciones para este método son los mismos que para Collection # create_index.
Ejemplos:
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
No pretendo que los conductores funcionen exactamente igual, es solo que, con fines ilustrativos, su explicación es un poco mejor en mi humilde opinión.
El método ensureIndex
en el Shell interactivo y ensure_index
en el controlador python son cosas diferentes, aunque se usa la misma palabra. Tanto el método ensure_index
método ensure_index
del controlador python crean un índice permanentemente.
Tal vez uno usaría ensure_index
con un TTL razonable en tal situación, porque no estoy seguro si create_index
recrearía el índice cada vez que lo llame. La recreación normalmente no es deseada y podría ser una operación pesada. Pero incluso ensure_index
(del controlador python o también ruby) podría recrear el índice siempre que el TTL haya expirado o cuando lo llame desde una instancia de cliente diferente o después de un reinicio. No estoy seguro de esto.
Quizás una posibilidad aún mejor es verificar primero, utilizando el método index_information()
, si el índice ya existe. Si ya existe, no lo crearías de nuevo.
Ahora estoy demostrando cómo se usa el término ensure_index
(o ensureIndex
) con 2 significados diferentes:
1) Crea un índice si aún no existe en la base de datos
Esto es lo que hace el método interactivo Shell ensureIndex()
:
http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics
También el Node.JS MongoDB Driver
comporta de esta manera:
https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js
(Busque la function ensureIndex
en el archivo collection.js
)
2) Crea un índice si no está en el "caché del controlador"
El mismo identificador se usa con un significado diferente aquí, que me parece confuso.
Python y el controlador de ruby almacenan información en la memoria sobre los índices que se crearon recientemente y llaman a este comportamiento ''caché''.
No informan a la base de datos sobre este almacenamiento en caché.
El resultado de este mecanismo es que si llama a create_index
o ensure_index
por primera vez con un valor TTL (tiempo de vida), el controlador insertará el índice en la base de datos y recordará esta inserción y también almacenará la información TTL en la memoria . Lo que se almacena en caché aquí es la hora y el índice que fue.
La próxima vez que llame a ensure_index
con el mismo índice de la misma colección en la misma instancia de controlador, el comando ensure_index
solo insertará el índice nuevamente, si los segundos TTL aún no han transcurrido desde la primera llamada.
Si llama a create_index
, el índice siempre se insertará, sin importar cuánto tiempo pasó desde la primera llamada, y por supuesto también si esta es la primera llamada.
Este es el controlador de Python, busque def ensure_index
en el archivo collection.py
:
https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py
Y el controlador ruby, busque def ensure_index
en el archivo collection.rb
:
https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb
(Tenga en cuenta que las diferentes instancias de los clientes no saben sobre el almacenamiento en caché de los demás, esta información se guarda únicamente en la memoria y es por instancia. Si reinicia la aplicación cliente, la nueva instancia desconoce las antiguas inserciones de índice "en caché". También otros clientes no saben, no se dicen entre sí.)
Todavía no podía entender por completo, lo que sucede en el db, cuando el controlador de python o el controlador de ruby insertan un índice que ya está allí. Sospecho que no hacen nada en este caso, lo cual tiene más sentido y también coincidiría con el comportamiento de Interactive Shell
y el controlador JS.
Tenga en cuenta que en Mongo 3.x ensureIndex está en desuso y debe desaconsejarse.
Obsoleto desde la versión 3.0.0: db.collection.ensureIndex () ahora es un alias para db.collection.createIndex ().
Lo mismo está en pymongo :
DEPRECATED - Asegura que exista un índice en esta colección.
Lo que significa que siempre debe usar create_index
.
Yo recomendaría crear metaclass y ORM. Desde la metaclase init, llama al método init_schema para inicializar los contadores, el esquema, las claves, etc. De esta forma evitas llamar a ensure_index cada consulta o actualización de colección :)
Todos los índices son permanentes. ensure_index () es solo un pequeño contenedor alrededor de create_index ().
"" "La función ensureIndex () solo crea el índice si no existe." ""
No hay nada como un índice transitorio o un índice temporal.