tutorial remove indexes index for create compound mongodb indexing mongodb-indexes

remove - mongodb show indexes



Índices de fondo de Mongodb: ¿son todavía de fondo una vez creados? (2)

Existen múltiples opciones de indexación: primer plano (predeterminado) y fondo. El primer plano es relativamente rápido y bloquea a todos los escritores y lectores. Otras bases de datos a las que todavía podemos llegar. Se supone que esto no debe hacerse en un entorno de producción.

La creación del índice de fondo es un poco más lenta y no bloquean a los lectores y escritores. Con MongoDB 2.4 y MongoDB posteriores, puede crear múltiples índices de fondo en paralelo incluso en la misma base de datos.

A partir de MongoDB 2.6, al crear un índice en segundo plano en el primario, los índices también se crearán en segundo plano en los secundarios. Los secundarios comenzarán la creación del índice cuando el primario complete la construcción de su índice.

Hay otra forma de crear un índice de manera muy eficiente en un sistema de producción. Esto es para crear un índice en un servidor diferente que se está utilizando para atender la mayoría de las consultas. Por ejemplo, en un conjunto de réplicas de múltiples servidores de bases de datos que trabajan en tándem, se puede sacar uno y las solicitudes se pueden enrutar a los disponibles. La creación del índice de primer plano se puede hacer en el servidor separado. Una vez que la creación se haya realizado con éxito, puede volver al clúster.

Al crear un índice en mongodb, puede especificar el background: true indicador background: true , lo que hace que la creación del índice no sea de bloqueo. Esto es excelente en producción ya que no desea que se bloquee toda la base de datos mientras crea un índice que claramente no necesitaba antes (ya que no lo tenía).

Al leer los docs , parece que este indicador solo determina cómo se crea el índice, y una vez que se construye, el índice actúa exactamente como un índice normal. Que es lo que me gustaría, no quisiera que el índice se desincronice con los documentos porque se está actualizando en segundo plano, aunque puedo imaginar una base de datos que haga esto.

Estoy preguntando aquí porque el comando getIndexes muestra que el índice aún está marcado como background incluso después de que se haya creado. ¿Esto es solo un recordatorio de cómo fue creado? ¿O los índices de background comportan de manera diferente después de ser creados? Tal vez un poco de sutileza con la replicación?


Una vez creados, actúan como índices regulares. Persisten en getIndexes solo como un recordatorio, similar a lo unique , sparse y así sucesivamente.

Pero también tiene el otro significado. Solo porque los índices en primer plano bloquean a todos los escritores, en este caso no podrá realizar db.testCollection.getIndexes() hasta que se hayan creado todos los índices. Mientras tanto, cuando creas un índice de fondo , puedes llamar a db.testCollection.getIndexes() y verás, ese índice parece estar ya creado.

Pero en este caso no podemos estar seguros de si los índices se han creado realmente o no. En este caso, debe llamar a db.currentOp() y si ve algo como

{ "inprog": [ { "opid": 2001060, "active": true, "secs_running": 1, "op": "insert", "ns": "test.system.indexes", "insert": { "v": 1, "key": { "a": 1 }, "ns": "test.testCollection", "name": "a_1", "background": 1 }, .... "msg": "bg index build Background Index Build Progress: 368640/1000000 36%", "progress": { "done": 368640, "total": 1000000 } ... } ] }

entonces significa que la creación de índices de fondo aún está en progreso, y también puede ver información sobre el proceso.

Por ejemplo, puede realizar algunos cálculos aproximados: 368640 de 1000000 tarda 1 segundos (+1 segundo como posible compensación), por lo tanto, todo debería demorar entre 3 y 6 segundos (finalmente tomó 4,8 s).

Obviamente, si no puede ver dicha operación en progreso, los índices ya están creados.

Nota : si tiene muchas operaciones simultáneas, puede especificar el argumento db.currentOp() para db.currentOp() , fe

db.currentOp({"insert.background":1})