¿A qué tamaño de datos resulta beneficioso pasar de SQL a NoSQL?

24

Como programador de bases de datos relacionales (la mayoría de las veces), leí artículos sobre cómo las bases de datos relacionales no se escalan, y las soluciones NoSQL como MongoDB lo hacen. Como la mayoría de las bases de datos que he desarrollado hasta ahora han sido de pequeña a mediana escala, nunca he tenido un problema que no haya sido resuelto por alguna indexación, optimización de consultas o rediseño de esquemas.

¿Qué tipo de tamaño esperaría ver con MySQL luchando? Cuantas filas

(Sé que esto dependerá de la aplicación y el tipo de datos almacenados. El que me consiguió era básicamente una base de datos de genética, por lo que tendría una tabla principal, con 3 o 4 tablas de búsqueda. La tabla principal contendrá entre otras cosas, una referencia cromosómica y una coordenada de posición. Probablemente se le preguntará por una cantidad de entradas entre dos pociones en un cromosoma, para ver qué se almacena allí).

wobbily_col
fuente
44
Probablemente no debería trabajar bajo el supuesto de que MySQL es el límite superior para el número de filas que puede manejar una base de datos relacional. Realmente estás haciendo dos preguntas: ¿ cuándo se queda sin cadena MySQL? y ¿Cuáles son los límites de la capacidad de SQL RDBMS? ¿Cuál quieres que te conteste?
Blrfl

Respuestas:

13

¿Qué tan grande es un dato?

Hay dos umbrales significativos:

  1. toda la información cabe en la RAM
  2. todo el índice de datos cabe en la RAM

Con las SSD rápidas, el primer umbral se convirtió en un problema menor, a menos que tenga mucho tráfico.

Acidez

Uno de los problemas con el escalado de RDBMS es que, por diseño, son ACID, lo que significa transacciones y bloqueos de nivel de fila (o incluso nivel de tabla en algunos RDBMS más antiguos / simples). Puede ser un factor limitante si tiene muchas consultas que modifican la gran cantidad de datos que se ejecutan al mismo tiempo. Las soluciones NoSQL suelen ir para el modelo de consistencia eventual

¿Cómo escala RDBMS en el tamaño de los datos?

No es del todo cierto que RDBMS no pueda escalar el tamaño de los datos, hay dos alternativas: partición vertical y partición horizontal (también conocido como fragmentación).

El particionamiento vertical consiste básicamente en mantener tablas no relacionadas en servidores de bases de datos separados, manteniendo así el tamaño de cada uno por debajo de los umbrales mencionados anteriormente. Esto hace que unir estas tablas con SQL simple sea menos directo y menos eficiente.

Sharding significa distribuir datos de una tabla entre varios servidores, en función de una clave específica. Esto significa que para las búsquedas sabes qué servidor consultar en función de esa clave. Sin embargo, esto complica las consultas que no son búsquedas en la clave de fragmentación.

En el caso de ambos tipos de particiones, si llega a extremos, básicamente termina con la misma situación que las bases de datos NoSQL.

vartec
fuente
99
Oracle, PostgreSQL, MySQL, MS SQL Server y Sybase son capaces de hacer uniones entre tablas en servidores remotos sin que el cliente tenga que hacer nada del trabajo.
Blrfl
44
Acerca de "datos completos en RAM" tenga en cuenta que se trata del conjunto de trabajo real. A menudo, las bases de datos son más grandes que la memoria, pero la mayor parte es raramente accesibles, teniendo que en el disco no es tan malo, siempre y cuando los índices y, a menudo filas captadas etc están en la memoria
Johannes
2
@vartec Entonces, ¿desea eliminar mi correo de 2 años de mi base de datos de correo mientras lo busco solo una vez al mes, mientras que mi conjunto de trabajo principal son los últimos diez correos?
johannes
3
@wobbily_col pista: no lo es. a menos que no le importe la consistencia, la fiabilidad o la durabilidad. en ese caso, puede desactivar muchas cosas que hacen que una sea mucho más rápida que la otra, o viceversa si lo desea. ¿Adivina cuáles son las configuraciones predeterminadas en cada una? (por supuesto, MySQL tampoco es el pináculo de la seguridad de los datos ...)
Javier
1
@vartec "Fragmentación automática" es agradable, donde es aplicable. Pero, de repente, ya no puede unir todos los datos. Oh, espere, en realidad no puede hacerlo con una base de datos de documentos, también buscar en todos los datos o crear informes se vuelve tedioso ... sí, las bases de datos de documentos tienen su lugar, cuando el modelo de datos y operaciones coinciden, lo mismo para otros sistemas ... la cantidad de datos por sí sola no es un factor (sé de suficientes instancias de MySQL que se ejecutan con datos en la región de terabytes con éxito ... y proyectos con algunos cientos de MB fallando)
johannes
13

No creo que el tamaño de los datos sea el único factor. El "modelo de datos" también es una parte muy importante.

Las páginas del catálogo de comercio electrónico (Solr, ElasticSearch), los datos de análisis web (Riak, Cassandra), los precios de las acciones (Redis), las conexiones de relaciones en las redes sociales (Neo4J, FleetDB) son solo algunos ejemplos cuando una solución NoSQL realmente brilla.

En mi humilde opinión, el modelo de datos tiene un papel más importante que el tamaño de los datos cuando se considera una solución NoSQL o RDBMS.

Quirón
fuente
99
Exactamente. todo este "big data" bla bla crap es hablar de marketing y todo el "NoSQL para big data!" las cosas también lo son. NoSQL es bueno para grandes conjuntos de datos porque es más rápido que un RDBMS tradicional, pero es más rápido debido a las enormes compensaciones de características que realiza. Muchos modelos de datos sufrirán significativamente debido a esas compensaciones, mientras que algunos funcionarán bien. Es una cuestión de saber lo que está perdiendo cuando va a NoSQL y solo usa NoSQL para datos que pueden sufrir tales pérdidas.
Jimmy Hoffa
1
Si bien es cierto, no es la respuesta a la pregunta formulada.
vartec
Esto no solo NO es la respuesta, sino que tampoco es cierto. Puede hacer un documento como una tabla en la base de datos SQL simplemente usando el tipo de datos JSON y hacer que la base de datos SQL brille sobre NoSQL.
Yevgeniy Afanasyev
6

Si las bases de datos relacionales no se escalan, nada lo hace. No te preocupes por los problemas de escala.

SQL tiene problemas con algunos tipos de análisis, pero no se necesitan muchos datos para desencadenar el problema. Por ejemplo, considere una sola tabla con una columna que hace referencia a otras filas en función de una clave única. Por lo general, esto podría usarse para crear una estructura de árbol. Puede escribir sentencias SQL rápidas que hagan referencia a la fila relacionada. O la fila relacionada de la fila relacionada. De hecho, puedes hacer cualquier número específico de saltos. Pero si, para cada fila, desea seleccionar un campo en la primera fila relacionada en la cadena que cumpla algún criterio, entonces se complica.

Considere una tabla de ubicaciones de oficinas a nivel de nación, provincia / estado, condado, pueblo y aldea, con cada oficina haciendo referencia a la oficina a la que informa. No hay garantía de que la oficina de informes de cada oficina esté solo un nivel más arriba. Para un conjunto seleccionado de oficinas, no todas en un nivel, desea enumerar la oficina nacional asociada de cada uno. Esto requiere bucles de declaraciones SQL y llevará mucho tiempo incluso hoy. (Solía ​​obtener 30 segundos en una selección de 30 oficinas, pero eso fue hace mucho tiempo, y cambiar a procedimientos almacenados ayudó un poco).

Entonces, la alternativa es poner toda la estructura en un gran bloque de datos, etiquetarlo y almacenarlo. Cuando desee analizar los datos, léalos todos en la memoria de una vez, configurando punteros para rastrear la estructura, y puede procesar un par de millones de oficinas en un abrir y cerrar de ojos.

Nada de esto tiene mucho que ver con la cantidad de datos. La clave es la naturaleza de la organización de los datos. Si un diseño relacional ayuda, entonces un RDBMS es lo que desea. Si no, algún tipo de almacenamiento a granel va a ser desde un poco hasta un billón de veces más rápido.

Tenga en cuenta que si uno de estos conjuntos de datos se vuelve demasiado grande para caber en la memoria, su base de datos que no sea SQL ya no funcionará. Otro problema es cuando necesita datos de más de un bloque a la vez; puede hacer esto si , y solo si, todos los bloques caben en la memoria a la vez. Y el usuario tiene que esperar mientras los carga.

Si su base de datos relacional le causará problemas, lo hará antes de que ingrese muchos datos. El único problema de escala que puede tener es con su programa cuando el bloque de datos que está ensamblando para un DB nosql, si tiene que usar uno, se vuelve demasiado grande para él. (Lea sobre errores de falta de memoria. Los idiomas más nuevos a veces hacen cosas extrañas con la memoria).

RalphChapin
fuente
0

Creo que la primera razón para ir a una solución NoSQL o distribuida no es tanto el tamaño de todos los datos, sino el tamaño de las tablas. Lo que las soluciones distribuidas funcionan bien es dividir las tablas en diferentes nodos y luego, cuando necesite consultar las tablas, cada nodo procesará su parte de la tabla.

Los RDBMS pueden hacer esto, pero la nueva ola de bases de datos NoSQL se ha creado para hacerlo. Oracle, MSSQL, MySQL tomaron su modelo centralizado y lo modificaron para que funcione en un entorno distribuido. Sin embargo, todavía se adhieren a las estrictas reglas de ACID, mientras que algunas de las nuevas bases de datos no se adhieren a las reglas estrictas, como el uso de la coherencia eventual.

No hay una cantidad establecida de datos en la que deba elegir uno sobre el otro. Lo que debe tenerse en cuenta son las necesidades de la base de datos y la cantidad de uso que recibe. Las bases de datos NoSQL pueden procesar conjuntos de datos más grandes más rápidamente, mientras que las bases de datos relacionales le dan la confianza de que sus datos son correctos con los principios de ACID.

DFord
fuente
0

También podría valer la pena mencionar que su modelo de datos tiene una gran influencia en las cosas. Si necesita crear alguna forma de estructura de árbol (es decir, tiene una clave foránea autorreferenciada en una tabla que contiene dicha clave foránea en una clave primaria compuesta) probablemente debería considerar hacerlo en alguna forma de base de datos que maneje esos tipos de datos realmente bien (como mongodb o couchdb).

Como han dicho otras personas, también debe tener en cuenta lo que sucede en su aplicación. si realmente necesita ACID en varias tablas, entonces realmente necesita seguir con un RDBMS, pero si tiene algo donde puede tener algunos datos ligeramente obsoletos y necesita la flexibilidad de un esquema NoSQL (llámelo sin esquema si lo desea, pero todavía tiene alguna forma de esquema implícito), entonces podría considerar comprar una tienda NoSQL ( http://www.10gen.com/customers/craigslist aquí es un ejemplo de por qué Craigslist cambió ... pero es cierto que están archivando ~ 10TB de datos, que sé que no encajan en el tamaño de su base de datos de tamaño pequeño a mediano en absoluto. Pero el caso de uso podría ser útil).

Tenga en cuenta que los sistemas NoSQL no necesariamente están ahí para reemplazar los RDMS, pero en muchos casos puede complementar su RDBMS a través de la idea de Polyglot Persistence y puede almacenar la mayoría de sus datos en un RDBMS, pero en instancias específicas de nicho puede descargar algunos de sus datos a alguna forma de tienda NoSQL.

harageth
fuente
0

Mongose puede instalar en varias computadoras / nodos. PostgreSQLno proporciona una herramienta integrada para fragmentar, sin embargo, citus está presente.

MongoDB admite bases de datos de hasta 64 terabytes y el tamaño del documento es de 16 megabytes.

MySQL tiene un límite de base de datos de 256 terabytes, 64 terabytes del tamaño máximo para una tabla y un límite de registro de 4 gigabytes

PostgreSQL no tiene límite en la base de datos (4 terabytes existen en algún lugar para la prueba) y tiene un límite de 1 gigabytes para el tamaño de cualquier campo en una tabla y nuevamente 64 terabytes el tamaño máximo para una tabla.

Yevgeniy Afanasyev
fuente