2010-11-11 13 views
7

Estoy desarrollando un proyecto en el trabajo para el que tengo que crear y mantener tablas de resumen por razones de rendimiento. Creo que el término correcto para esto es Vistas materializadas.Método preferido para vistas materializadas (tablas de resumen) con MySQL

tengo 2 razones principales para hacer esto:

  1. Denormalization

    normalicé las mesas tanto como sea posible. Entonces hay situaciones en las que tendría que unirme a muchas tablas para extraer datos. Trabajamos con MySQL Cluster, que tiene un rendimiento bastante pobre cuando se trata de JOIN.

    Necesito crear tablas desnormalizadas que puedan ejecutar SELECT más rápido.

  2. resumir los datos

    Por ejemplo, tengo una tabla Transacciones con unos pocos millones de registros. Las transacciones provienen de diferentes sitios web. La aplicación necesita generar un informe que muestre los recuentos de transacciones diarias o mensuales y los montos totales de ingresos por sitio web. No quiero que la secuencia de comandos del informe calcule esto cada vez, así que necesito generar una tabla de resumen que tenga un desglose por [sitio, fecha].

    Eso es solo un ejemplo simple. Hay muchos tipos diferentes de tablas de resumen que necesito generar y mantener.

En el pasado he hecho estas cosas escribiendo varios scripts cron para mantener cada tabla de resumen actualizada. Pero en este nuevo proyecto, espero implementar una solución más elegante y adecuada.

Preferiría una solución basada en PHP, ya que no soy un administrador del servidor, y me siento más cómodo cuando puedo controlar todo a través de mi código de aplicación.


Soluciones que he considerado:

  1. copia de VISTA

    Si la tabla resultante se puede representar como una sola consulta SELECT, puedo generar una vista . Como son lentas, puede haber un cronjob que copie esta VISTA en una tabla real.

    Sin embargo, algunas de estas consultas SELECT pueden ser tan lentas que no son aceptables incluso para cronjobs. No es muy eficiente recrear todos los datos de resumen, si las filas anteriores ni siquiera se actualizan mucho.

  2. Cronjobs personalizados para cada Cuadro Resumen

    Esta es la solución que he usado antes, pero ahora estoy tratando de evitarla si es posible. Si habrá muchas tablas de resumen, puede ser complicado mantenerlas.

  3. MySQL disparadores

    Es posible añadir factores desencadenantes de las tablas principales de modo que cada vez que hay un INSERT, UPDATE o DELETE, las tablas de resumen se actualizan en consecuencia.

    No habría cronjobs y los resúmenes serían en tiempo real. Sin embargo, si alguna vez fuera necesario reconstruir una tabla de resumen desde cero, tendría que hacerse con otra solución (probablemente la n. ° 1 anterior).

  4. El uso de ORM Ganchos/disparadores

    estoy usando Doctrina como mi ORM. Hay una forma de agregar detectores de eventos que desencadenarán cosas en INSERT/UPDATE/DELETE, que a su vez puede actualizar las tablas de resumen. En cierto sentido, esta solución es similar al n. ° 3 anterior, pero tendré un mejor control sobre estos desencadenantes ya que se implementarán en PHP.


Consideraciones de implementación:

  1. completo sigue reconstruyendo

    que quieren evitar tener que reconstruir las tablas de resumen, la eficiencia, y sólo actualización para nuevos datos. Pero en caso de que algo salga mal, necesito la capacidad de reconstruir la tabla de resumen desde cero utilizando los datos existentes en las tablas principales.

  2. Haciendo caso omiso de actualizar/eliminar en datos antiguos

    Algunos resúmenes pueden asumir que los registros anteriores no serán actualizados o borrados, pero se insertarán sólo nuevos registros. El proceso de resumen puede ahorrar mucho trabajo al asumir que no es necesario verificar actualizaciones en datos anteriores.

    Pero, por supuesto, esto no se aplicará a todas las tablas.

  3. Mantener un registro de

    Vamos a suponer que no voy a tener acceso a, o no quieren utilizar los registros de MySQL binarios.

    Para resumir los datos nuevos, el proceso de resumen solo necesita recordar los últimos ID de la clave principal para los últimos registros que resumió. La próxima vez que se ejecute, puede resumir todo después de esa identificación. Sin embargo, para realizar un seguimiento de los registros anteriores que se han actualizado/eliminado, necesita otro registro para que pueda retroceder y volver a resumir esos datos.


Le agradecería cualquier tipo de estrategias, sugerencias o enlaces que pueden ayudar. ¡Gracias!

+0

Las vistas materializadas son vistas que pueden indexarse ​​(denominadas "vistas indizadas" en la terminología de TSQL/SQL Server). Están notoriamente restringidos en funcionalidad, y MySQL no los admite. MySQL apenas admite vistas no materializadas, comparando la funcionalidad con otros proveedores. Oracle es el único otro DB que conozco que admite vistas materializadas, además de SQL Server. Esperaría que DB2 lo haga, pero PostgreSQL no. –

Respuesta

2

Como se indicó anteriormente, las vistas materializadas en Oracle son diferentes a las vistas indizadas en SQL Server. Son muy geniales y útiles.Ver http://download.oracle.com/docs/cd/B10500_01/server.920/a96567/repmview.htm para más detalles

Sin embargo, MySql no tiene soporte para estos.

Una cosa que menciona varias veces es el bajo rendimiento. ¿Ha comprobado el diseño de su base de datos para la indexación adecuada y ejecutar planes de explicación en las consultas para ver por qué son lentos? Vea aquí http://dev.mysql.com/doc/refman/5.1/en/using-explain.html. Por supuesto, esto supone que su servidor está sintonizado correctamente, tiene la configuración y el ajuste de mysql, p. búferes de memoria intermedia, etc. etc. etc.

A su pregunta directa. Lo que parece que quiere hacer es algo que hacemos a menudo en una situación de depósito de datos. Tenemos una base de datos de producción y un DW que extrae todo tipo de información, agregados y precategorizaciones para acelerar la consulta. Esto puede ser excesivo para usted, pero puede decidir. Dependiendo de la latencia que defina para sus informes, es decir, con qué frecuencia los necesita, normalmente pasamos por un proceso ETL (extraer la carga de transformación) periódicamente (diariamente, semanalmente, etc.) para completar el DW del sistema de producción. Esto mantiene el impacto bajo en el sistema de producción y mueve todos los informes a otro conjunto de servidores, lo que también reduce la carga. Por el lado de DW, normalmente diseñaría mis esquemas de manera diferente, es decir, usando esquemas de estrella. (http://www.orafaq.com/node/2286) Los esquemas de estrellas tienen tablas de hechos (cosas que desea medir) y dimensiones (elementos por los que desea agregar las medidas (tiempo, geografía, categorías de productos, etc.) SQL Server también incluyen un motor adicional llamado SQL Server Analysis Services (SSAS) para ver las tablas y dimensiones de hechos, pre calcular y construir cubos de datos OLAP. En estos cubos de datos puede profundizar y observar todos los tipos de patrones, hacer datos análisis y extracción de datos. Oracle hace las cosas de forma ligeramente diferente, pero el resultado es el mismo.

Si desea realizar la ruta depende realmente de la necesidad del negocio y de cuánto valor obtiene del análisis de datos. Como dije, es Probablemente exagere si solo tiene unas pocas tablas de resumen, pero algunos de los conceptos que puede encontrar útiles a medida que piensa en las cosas. Si su negocio se dirige hacia un sol de inteligencia empresarial Entonces, esto es algo a considerar.

PD En realidad puede configurar un DW para que funcione en "tiempo real" usando algo llamado ROLAP si esa es la necesidad del negocio. Microstrategy tiene un buen producto que funciona bien para esto.

PPS También es posible que desee ver PowerPivot de MS (http://www.powerpivot.com/learn.aspx) Solo he jugado con él, así que no puedo decirle cómo funciona en grandes conjuntos de datos.

3

Flexviews (http://flexvie.ws) es un proyecto basado en PHP/MySQL de código abierto. Flexviews agrega vistas materializadas refrescables incrementales (como las vistas materializadas en Oracle) a MySQL, usng PHP y procedimientos almacenados.

Incluye FlexCDC, una utilidad de captura de datos basada en PHP que lee registros binarios, y los procedimientos almacenados MySQL de Flexviews que se utilizan para definir y mantener las vistas.

Flexviews admite combinaciones (combinación interna solamente) y agregación para que se pueda usar para crear tablas de resumen. Además, puede usar Flexviews en combinación con el diseñador de agregación de Mondrian (un servidor ROLAP) para crear tablas de resumen que la herramienta ROLAP puede usar automáticamente.

Si no tiene acceso a los registros (puede leerlos de forma remota, por cierto, por lo que no necesita acceso al servidor, pero sí necesita SUPER privs), puede utilizar la actualización "COMPLETA" con Flexviews. Esto automatiza la creación de una nueva tabla con 'CREATE TABLE ... AS SELECT' bajo un nuevo nombre de tabla. A continuación, usa RENAME TABLE para cambiar la nueva tabla por una, renombrando la antigua con un postfijo antiguo. Finalmente deja caer la mesa vieja. La ventaja aquí es que el SQL para crear la vista se almacena en la base de datos (flexviews.mview) y se puede actualizar con una simple llamada API que automatiza el proceso de intercambio.

Cuestiones relacionadas