una tablas recomendaciones queries porque para optimizador lenta las grandes daƱan datos cuello consulta como cantidades botella agilizar mysql ruby-on-rails ruby database

mysql - recomendaciones - Estrategia para tratar con grandes tablas db



tablas grandes mysql (3)

Si desea dividir sus datos por tiempo, la siguiente solución puede ajustarse a su necesidad. Probablemente puedas usar tablas MERGE ;

Supongamos que su tabla se llama MyTable y que necesita una tabla por semana

  1. Tu aplicación siempre inicia sesión en la misma tabla
  2. Un trabajo semanal cambia de nombre de forma atómica a su tabla y recrea una vacía: MyTable se renombra a MyTable-Year-WeekNumber, y se crea una nueva MyTable vacía
  3. Las tablas fusionadas se eliminan y vuelven a crear.

Si desea obtener todos los datos de los últimos tres meses, cree una tabla de fusión que incluirá solo las tablas de los últimos 3 meses. Cree tantas tablas de combinación como necesite períodos diferentes. Si no puede incluir la tabla en la que están insertados los datos (MyTable en nuestro ejemplo), estará aún más contento, ya que no tendrá ninguna concurrencia de lectura / escritura.

Estoy buscando construir una aplicación de Rails que tenga algunas tablas bastante grandes con más de 500 millones de filas. Para mantener las cosas ágiles, actualmente estoy investigando cómo se puede dividir una tabla grande en fragmentos más manejables. Veo que a partir de MySQL 5.1 hay una opción de partición y esa es una opción posible, pero no me gusta la forma en que la columna que determina el particionamiento debe ser parte de la clave primaria en la tabla.

Lo que realmente me gustaría hacer es dividir la tabla en la que escribe un modelo AR en función de los valores escritos, pero, por lo que sé, no hay forma de hacerlo, ¿alguien tiene alguna sugerencia sobre cómo podría implementar esto? o alguna estrategia alternativa?

Gracias

Arfon


Puede manejar esto completamente en Active Record usando DataFabric .

No es tan complicado implementar un comportamiento similar si eso no es adecuado. Google sharding para mucha discusión sobre el patrón arquitectónico de manipulación de particiones de tabla dentro del nivel de la aplicación. Tiene las ventajas de evitar middleware o dependiendo de las características específicas de db vendedor. Por otro lado, es más código en tu aplicación de la que eres responsable.


Las columnas de partición en MySQL no están limitadas a claves principales. De hecho, una columna de partición no tiene que ser una clave en absoluto (aunque se creará una para ella de forma transparente). Puede dividir por RANGE, HASH, KEY y LIST (que es similar a RANGE solo que es un conjunto de valores discretos). Lea el manual de MySQL para obtener una descripción general de los tipos de partición.

Existen soluciones alternativas, como HScale , un complemento de middleware que divide las tablas de forma transparente en función de ciertos criterios. HiveDB es un marco de código abierto para partición horizontal para MySQL.

Además de sharding y partioning debe emplear algún tipo de agrupamiento. La configuración más simple es una configuración basada en la replicación que le ayuda a distribuir la carga en varios servidores físicos. También debería considerar soluciones de clúster más avanzadas como el clúster MySQL (probablemente no sea una opción debido al tamaño de su base de datos) y el middleware de clúster como Sequioa .

De hecho, hice una pregunta relevante sobre escalar con MySQL aquí en el desbordamiento de pila hace algún tiempo, y terminé respondiéndome a mí mismo varios días después después de recopilar mucha información sobre el tema. Puede ser relevante para ti también.