Pregunta

Tenemos una base de datos InnoDB de aproximadamente 70 GB y esperamos que crezca a varios cientos de GB en los próximos 2 o 3 años.Alrededor del 60 % de los datos pertenecen a una sola tabla.Actualmente la base de datos funciona bastante bien ya que tenemos un servidor con 64 GB de RAM, por lo que casi toda la base de datos cabe en la memoria, pero nos preocupa el futuro cuando la cantidad de datos sea considerablemente mayor.En este momento estamos considerando alguna forma de dividir las tablas (especialmente la que representa la mayor parte de los datos) y ahora me pregunto cuál sería la mejor manera de hacerlo.

Las opciones que conozco actualmente son

  • Usando MySQL Partitioning que viene con la versión 5.1
  • Usar algún tipo de biblioteca de terceros que encapsule la partición de los datos (como fragmentos de hibernación)
  • Implementándolo nosotros mismos dentro de nuestra aplicación.

Nuestra aplicación está basada en J2EE y EJB 2.1 (con suerte, algún día cambiaremos a EJB 3).

¿Qué sugieres?

EDITAR (11 de febrero de 2011):
Sólo una actualización:Actualmente el tamaño de la base de datos es de 380 GB, el tamaño de los datos de nuestra tabla "grande" es de 220 GB y el tamaño de su índice es de 36 GB.Entonces, aunque la tabla completa ya no cabe en la memoria, el índice sí.
El sistema todavía funciona bien (aún en el mismo hardware) y todavía estamos pensando en particionar los datos.

EDITAR (04/06/2014):Una actualización más:El tamaño de toda la base de datos es de 1,5 TB, el tamaño de nuestra tabla "grande" es de 1,1 TB.Actualizamos nuestro servidor a una máquina de 4 procesadores (Intel Xeon E7450) con 128 GB de RAM.El sistema todavía funciona bien.Lo que planeamos hacer a continuación es colocar nuestra mesa grande en un servidor de base de datos separado (ya hemos realizado los cambios necesarios en nuestro software) y al mismo tiempo actualizar a un nuevo hardware con 256 GB de RAM.

Se supone que esta configuración durará dos años.Entonces tendremos que empezar finalmente a implementar una solución de fragmentación o simplemente comprar servidores con 1 TB de RAM, lo que debería permitirnos seguir funcionando durante algún tiempo.

EDITAR (2016-01-18):

Desde entonces, hemos colocado nuestra tabla grande en su propia base de datos en un servidor separado.Actualmente, el tamaño de esta base de datos es de aproximadamente 1,9 TB, el tamaño de la otra base de datos (con todas las tablas excepto la "grande") es de 1,1 TB.

Configuración de hardware actual:

  • HP ProLiant DL 580
  • 4 CPU Intel(R) Xeon(R) E7-4830
  • 256 GB de RAM

El rendimiento es bueno con esta configuración.

¿Fue útil?

Solución

Si cree que va a estar vinculado a IO/memoria, no creo que la partición sea útil.Como de costumbre, la evaluación comparativa primero le ayudará a determinar la mejor dirección.Si no tiene servidores de repuesto con 64 GB de memoria, siempre puede pedirle a su proveedor una "unidad de demostración".

Me inclinaría por la fragmentación si no espera un informe agregado de 1 consulta.Supongo que fragmentarías toda la base de datos y no solo tu tabla grande:lo mejor es mantener entidades enteras juntas.Bueno, de todos modos si tu modelo se divide bien.

Otros consejos

Definitivamente comenzarás a tener problemas con esa tabla de 42 GB una vez que ya no quepa en la memoria.De hecho, tan pronto como ya no quepa en la memoria, el rendimiento se degradará extremadamente rápidamente.Una forma de realizar la prueba es colocar esa tabla en otra máquina con menos RAM y ver qué tan pobre funciona.

En primer lugar, no importa tanto dividir las tablas a menos que también mueva algunas de las tablas a un volumen físico separado.

Esto es incorrecto.El particionado (ya sea a través de la función de MySQL 5.1 o lo mismo usando tablas MERGE) puede proporcionar importantes beneficios de rendimiento incluso si las tablas están en la misma unidad.

Como ejemplo, digamos que está ejecutando consultas SELECT en su tabla grande usando un rango de fechas.Si la tabla está completa, la consulta se verá obligada a escanear toda la tabla (y con ese tamaño, incluso el uso de índices puede ser lento).La ventaja de la partición es que sus consultas sólo se ejecutarán en las particiones donde sea absolutamente necesario.Si cada partición tiene un tamaño de 1 GB y su consulta solo necesita acceder a 5 particiones para realizarse, la tabla combinada de 5 GB es mucho más fácil de manejar para MySQL que una versión monstruosa de 42 GB.

Una cosa que debe preguntarse es cómo consulta los datos.Si existe la posibilidad de que sus consultas solo necesiten acceder a ciertos fragmentos de datos (es decir,un rango de fechas o rango de ID), la partición de algún tipo resultará beneficiosa.

Escuché que todavía hay algunos errores con la partición de MySQL 5.1, particularmente relacionados con la elección de la clave correcta por parte de MySQL.Las tablas MERGE pueden proporcionar la misma funcionalidad, aunque requieren un poco más de sobrecarga.

¡Espero que ayude, buena suerte!

Este es un gran ejemplo de lo que puede hacer la partición MySql en un ejemplo real de grandes flujos de datos:

http://web.archive.org/web/20101125025320/http://www.tritux.com/blog/2010/11/19/partitioning-mysql-database-with-high-load-solutions/11/1

Esperando que sea de ayuda para su caso.

Hace un tiempo, en un evento de Microsoft ArcReady, vi una presentación sobre patrones de escala que podrían resultarle útiles.Puede ver las diapositivas para ello en línea.

Yo elegiría MariaDB InnoDB + Particiones (ya sea por clave o por fecha, según sus consultas).

Hice esto y ahora ya no tengo ningún problema con la base de datos.

MySQL se puede reemplazar con MariaDB en segundos... todos los archivos de la base de datos permanecen iguales.

En primer lugar, no importa tanto dividir las tablas a menos que también mueva algunas de las tablas a un volumen físico separado.

En segundo lugar, no es necesariamente la mesa con el tamaño físico más grande la que desea mover.Es posible que tenga una tabla mucho más pequeña que tenga más actividad, mientras que su tabla grande permanece bastante constante o solo agrega datos.

Hagas lo que hagas, no lo implementes tú mismo.Deje que el sistema de base de datos se encargue de ello.

¿Qué hace la mesa grande?

Si vas a dividirlo, tienes algunas opciones:
- Dividirlo usando el sistema de base de datos (no sé mucho sobre eso)
- Dividirlo por fila.
- divídalo por columna.

Dividirlo por fila solo sería posible si sus datos se pueden separar fácilmente en fragmentos.p.ej.Algo como Campamento base tiene varias cuentas que están completamente separadas.Podrías mantener el 50% de las cuentas en una tabla y el 50% en una tabla diferente en una máquina diferente.

Dividir por columna es bueno para situaciones en las que el tamaño de la fila contiene campos de texto grandes o BLOBS.Si tiene una tabla con (por ejemplo) una imagen de usuario y un gran bloque de texto, puede agrupar la imagen en una tabla completamente diferente.(en una máquina diferente)

Rompes la normalización aquí, pero no creo que cause demasiados problemas.

Como de costumbre, la evaluación comparativa primero le ayudará a determinar la mejor dirección.

Eso es lo que me dice la mayoría de la gente, así que creo que finalmente tendré que tomar esa pastilla…

Probablemente querrás dividir esa mesa grande eventualmente.Probablemente querrás colocarlo en un disco duro separado antes de pensar en un segundo servidor.Hacerlo con MySQL es la opción más conveniente.Si es capaz, entonces hazlo.

PERO

En realidad, todo depende de cómo se utilice su base de datos.Estadísticas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top