
Ser esquemático es una de las características clave de MongoDB. En el lado positivo, esto permite a los desarrolladores modificar fácilmente el esquema de sus colecciones sin esperar a que la base de datos esté lista para aceptar un nuevo esquema. Sin embargo, schemales no es gratuito y uno de los inconvenientes es la amplificación de la escritura. Centrémonos en este tema.
¿Escribes la amplificación?
El vínculo entre el esquema y la amplificación de escritura no es obvio a primera vista. Así que primero veamos una tabla en el mundo relacional:
mysql> SELECT * FROM usuario LIMIT 2; + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— + | identificación | iniciar sesión | nombre | apellido | ciudad | país | código postal | habla a contraseña | año_nacimiento | + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— + | 1 | arco | vernon | Cloe | Paulista | Islas Cook | 28529 | PO Box 369, 1464 Ac Rd. | SSC44GZL5R | 1970 | | 2 | quis | Rogan | Luis | Nashville | San Vicente y las Granadinas | H3T 3S6 | Apartado Postal 636, Elementum 5236, Av. | TSY29YRN6R | 1983 | + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— +
mysql> SELECCIONE * SÍ usuario LÍMITE 2; + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— + | identificación | acceso | primer nombre | apellido | ciudad | país | código postal | habla a | contraseña | año_nacimiento | + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— + | 1 | inclinarse | Vernon | Cloe | Paulista | cocinar Islas | 28529 | pags.o. Caja 369, 1464 C.A Calle. | SSC44GZL5R | 1970 | | 2 | quis | Rogan | Luis | Nashville | santa mierda Vicente y tu granadinas | H3T 3S6 | pags.o. Caja 636, 5236 elemental, AV. | TSY29YRN6R | 1983 | + —- + ——- + ———— + ———– + ———– + ——————————— + ———- + —- ——————————- + ———— + —- – —— + |
Dado que todos los registros tienen exactamente los mismos campos, los nombres de los campos se guardan una vez en un archivo separado (archivo .frm). Entonces, los nombres de los campos son metadatos, mientras que el valor de cada campo para cada registro es, por supuesto, datos.
Ahora veamos una colección equivalente en MongoDB:
{{«login»: «arcu», «first_name»: «Vernon», «last_name»: «Chloe», «city»: «Paulista», «country»: «Isule Cook», «zipcode»: «28529» , «dirección»: «PO Box 369, 1464 Ac Rd.», «contraseña»: «SSC44GZL5R», «birth_year»: 1970}, {«login»: «quis», «first_name»: «Rogan», «last_name «:» Lewis «,» ciudad «:» Nashville «,» país «:» San Vicente y las Granadinas «,» código postal «:» H3T 3S6 «,» dirección «:» PO Box 636, 5236 Elementum, Av. » , «contraseña»: «TSY29YRN6R», «año_nacimiento»: 1983}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 24 |
{ { «acceso»: «inclinarse», «primer nombre»: «Vernon», «Apellido»: «Chloe», «ciudad»: «Paulista», «país»: «Islas Cook», «Código postal»: «28529», «habla a»: «PO Box 369, 1464 Ac Rd»., «Contraseña»: «SSC44GZL5R», «año_nacimiento»: 1970 }, { «acceso»: «quién», «primer nombre»: «Rogan», «Apellido»: «Luis», «ciudad»: «Nashville», «país»: «San Vicente y las Granadinas», «Código postal»: «H3T 3S6», «habla a»: Apartado Postal 636, Elementum 5236, Av., «Contraseña»: «TSY29YRN6R», «año_nacimiento»: 1983 } } |
Una diferencia con una tabla en el mundo relacional es que MongoDB no sabe qué campos contendrá cada documento. Por lo tanto, se dan los nombres de los campos, no los metadatos, y deben guardarse con cada documento.
Entonces, la pregunta es: ¿qué tan grande es la sobrecarga en términos de espacio en disco? Para tener una idea, inserté 10M de esos discos en una tabla InnoDB (agregando un índice en la contraseña y en birth_year para que la tabla pareciera una tabla real): el tamaño del disco es alrededor. 1,4 GB.
También inserté exactamente los mismos 10 millones de discos en una colección MongoDB usando el motor de almacenamiento MMAPv1 normal, volviendo a agregar un índice en la contraseña y en birth_year, y esta vez el tamaño del disco es… 2,97 GB!
Por supuesto, esta no es una comparación de manzanas con manzanas, ya que el formato de almacenamiento InnoDB y el formato de almacenamiento MongoDB no son idénticos. Sin embargo, una diferencia del 100% sigue siendo significativa.
Compresión
Una forma de lidiar con la amplificación de la escritura es usar la compresión. Con MongoDB 3.0, usted tigre con cable El motor de almacenamiento está disponible y una de sus ventajas es la compresión (algoritmo predeterminado: rápido). Percona TokuMX también tiene compresión incorporada con zlib por defecto.
La reconstrucción de la colección con 10 millones de documentos y 2 índices ahora arroja los siguientes resultados:
Tigre con cable: 1,14 GB
TokuMX: 736 MB
Esta es una reducción del tamaño de los datos de 2,5x a 4x, ¡muy bien!
WiredTiger también proporciona compresión zlib y, en este caso, la colección es solo eso. 691 megabytes. Sin embargo, el uso de la CPU es mucho mayor en comparación con Snappy, por lo que zlib no se podrá utilizar en todas las situaciones.
Conclusiones
El diseño impecable de MongoDB es atractivo, pero viene con varios intercambios. La amplificación de escritura es una de ellas y usar WiredTiger con MongoDB 3.0 o Percona TokuMX es una forma muy sencilla de resolver el problema.