2010-05-27 7 views
7

Soy un desarrollador solitario para una empresa de telecomunicaciones, y estoy buscando algún consejo de diseño de bases de datos con cualquier persona con un poco de tiempo para responder.Se necesita asesoramiento en el diseño de bases de datos

Estoy insertando en una tabla ~ 2 millones de filas cada día, estas tablas se archivan y comprimen mensualmente. Cada tabla mensual contiene ~ 15,000,000 filas. Aunque esto está aumentando mes a mes.

Para cada inserción que hago arriba, estoy combinando los datos de las filas que pertenecen juntas y creando otra tabla "correlacionada". Esta tabla no se está archivando actualmente, ya que necesito asegurarme de que nunca me pierdo una actualización de la tabla correlacionada. (Espero que tenga sentido) Aunque, en general, esta información debe permanecer bastante estática después de un par de días de procesamiento.

Todo lo anterior funciona a la perfección. Sin embargo, ahora mi compañía desea realizar estadísticas con estos datos, y estas tablas se están volviendo demasiado grandes para proporcionar los resultados en lo que se consideraría un tiempo razonable. Incluso con los índices apropiados establecidos.

Así que supongo que después de todo lo anterior, mi pregunta es bastante simple. ¿Debo escribir un script que agrupe los datos de mi tabla correlacionada en tablas más pequeñas? ¿O debería almacenar los conjuntos de resultados de consultas en algo como Memcache? Ya estoy usando la memoria caché de MySQL, pero debido a que tengo un control limitado sobre cuánto tiempo se almacenan los datos, no funciona de manera ideal.

Las principales ventajas que puedo ver de usar algo como Memcache:

  • Sin bloqueo en mi mesa correlacionada después de la consulta ha sido cobrado.
  • Mayor flexibilidad para compartir los datos recopilados entre el recopilador de fondo y el procesador de entrada. (es decir, los informes personalizados pueden escribirse en el backend y los resultados de estos almacenados en la memoria caché bajo una clave que luego se comparte con cualquiera que desee ver los datos de este informe)
  • Redundancia y escalabilidad si comenzamos compartiendo esta información con una gran cantidad de clientes.

Las principales desventajas que puede ver de usar algo como Memcache:

  • de datos no es persistente si la máquina se reinicia/caché se vacía.

Las principales ventajas de utilizar MySql

  • de datos persistentes.
  • cambios en el código Menos (aunque añadiendo algo así como Memcache es trivial de todos modos)

Las principales desventajas del uso de MySql

  • tiene que definir las plantillas de mesa cada vez que quiero para almacenar proporcionar una nueva conjunto de datos agrupados.
  • Tiene que escribir un programa que recorre los datos correlacionados y rellena estas nuevas tablas.
  • Potencialmente seguirá creciendo más lentamente a medida que los datos continúen llenándose.

Disculpas por una pregunta bastante larga. Me ayudó a escribir estos pensamientos aquí de todos modos, y cualquier consejo/ayuda/experiencia con este tipo de problema sería muy apreciado.

Muchas gracias.

Alan

+5

Bienvenido a StackOverflow. Las preguntas largas generalmente son buenas, ya que tienden a mostrar algunas cosas importantes, 1) realmente te importa obtener una buena respuesta en lugar de 'dame el código' 2) tienden a tener todas (o al menos la mayoría) de la información necesario para responder con precisión a la pregunta, después de todo basura en == basura fuera. – UnkwnTech

Respuesta

2

Aparte de las opciones que se discuten arriba, también puede ser que desee considerar la adición de un hardware más potente en la imagen, si eso es una opción.

Este bit de su pregunta muestra que el problema subyacente aquí es la velocidad de los resultados:

Sin embargo mi empresa desea ahora realizar algunas estadísticas en contra de estos datos, y estas mesas están recibiendo demasiado grande a proporcionar los resultados en lo que se consideraría como un tiempo razonable.

En situaciones donde la velocidad de los resultados es importante, arrojar hardware mejor/extra al problema a menudo puede resultar más barato que desarrollar nuevas estructuras de código/base de datos/etc.

¡Solo una idea!

+0

Después de leer la pregunta, mi primer pensamiento fue 'Morez Hardz' pero parece que me golpearon. –

+0

Gracias, supongo que mi cuello de botella ahora está puramente en la E/S al extraer los datos del disco duro. No estoy seguro de qué solución usaría incluso si tuviera otra máquina/más unidades en la ecuación. Por supuesto que hay discos SSD, supongo? –

+0

Si MySql está almacenando en caché los bloques de datos en la memoria, la E/S no es necesariamente el cuello de botella. Tal vez haga algún monitoreo para descubrir si es o no. – codeulike

1

(Otra respuesta de mí, tan diferentes que voy a publicar por separado)

dos preguntas:

¿Qué tipo de estadísticas tiene su empresa quiere generar?
y
Después de insertar filas en la base de datos, ¿alguna vez se modifican?

Si los datos no cambian después de la inserción, entonces es posible que pueda compilar una tabla de "estadísticas" separada, que modifique/actualice a medida que se inserten nuevas filas, o tal vez poco después de que se inserten nuevas filas.

p. Ej. cosas como:

  • Cuando se inserta una nueva fila eso es relevante a stat 'B', ir a incrementar un número en otra mesa para stat 'B', minuto 'Y'
    o
  • Cada hora, ejecutar una consulta pequeña en las filas que se han insertado en la última hora, que genera las estadísticas para esa hora y las almacena por separado
    o
  • Como el anterior, pero cada minuto, etc.

Su duro ser más específico fic sin conocer los detalles, pero dependiendo de las estadísticas que busca, este tipo de enfoques pueden ayudar.

+0

Las estadísticas son básicas, como minutos de grupo por destino. grupos cuentan por destino, estadísticas de grupo por cliente. Toda la información está en la tabla correlacionada. Lo que significa que tengo que esperar hasta que tenga datos completos correlacionados. Con las tres soluciones anteriores, ¿cuál sería su preferencia? Obviamente, hacer la inserción y la actualización de cada inserción ralentizará la velocidad a la que puedo hacer una inserción de registro completa. –

+0

Si puede actualizar las estadísticas a medida que se inserta cada inserción (que también es lo que sugirió el usuario, a continuación), entonces eso es conceptualmente más simple, pero como dice, las actualizaciones son más lentas. También aumenta la probabilidad de errores en el código de inserción, que no desea. Un proceso separado que genera estadísticas para las inserciones recientes cada n minutos es más seguro y (en teoría) no ralentizará las inserciones. Pero es un poco más difícil de codificar. – codeulike

1

Si desea hacer algunos análisis de datos estáticos de unos días atrás, quizás debería considerar usar algo así como un sistema OLAP.

Básicamente, este tipo de sistema almacena estadísticas intermedias en su formato para hacer una suma rápida(), avg(), contar() ... en una tabla grande.

Creo que su pregunta es un ejemplo perfecto de la situación en la que se usa, pero quizás creo que sí solo porque es mi trabajo. =)

Echa un vistazo.

+0

Muchas gracias, echaré un vistazo a OLAP ahora –

1

Trabajo en una empresa con una situación similar, con millones de insertos mensuales.

Adoptamos la estrategia de resumir los datos en tablas más pequeñas, agrupadas por campos determinados.

En nuestro caso, cuando se realiza una inserción, desencadena una función que clasifica la tupla insertada e incrementa las tablas de resumen.

De vez en cuando, movemos las filas más antiguas a una tabla de copia de seguridad, reduciendo el crecimiento de la tabla principal.

+0

Parece que este es el camino a seguir. Gracias por su respuesta. –

Cuestiones relacionadas