Pregunta

Tengo una gran base de datos de la normalización de los datos de los pedidos que se está volviendo muy lento para la consulta para la presentación de informes.Muchas de las preguntas que voy a usar en los informes de unirse a cinco o seis tablas y tener que examinar decenas o cientos de miles de líneas.

Hay un montón de consultas y la mayoría han sido optimizados tanto como sea posible para reducir la carga del servidor y aumentar la velocidad.Creo que es hora de empezar a mantener una copia de los datos en un sin normalizar formato.

Las ideas sobre un enfoque?Debo comenzar con un par de mis peores consultas e ir de allí?

¿Fue útil?

Solución

Sé más acerca de mssql que mysql, pero no creo que el número de combinaciones o el número de filas que están hablando debería causar demasiados problemas con los índices correctos en el lugar.¿Ha analizado el plan de consulta, a ver si te falta alguno?

http://dev.mysql.com/doc/refman/5.0/en/explain.html

Dicho esto, una vez que se satisifed con sus índices y se han agotado todas las otras vías, de-normalización podría ser la respuesta correcta.Si sólo tienes una o dos consultas que son problemas, un enfoque manual es probablemente apropiado, mientras que algún tipo de almacenamiento de datos de la herramienta puede ser lo mejor para la creación de una plataforma para el desarrollo de cubos de datos.

Este es un sitio que he encontrado que toca el tema:

http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D

He aquí una sencilla técnica que puede utilizar para mantener a eliminar la normalización de las consultas simples, si usted está haciendo un par en un momento (y no soy la sustitución de su OLTP tablas, la creación de uno nuevo para propósitos de reporte).Digamos que usted tiene esta consulta en la aplicación:

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

Se podría crear una tabla no normalizada y rellenar con casi la misma consulta:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

Aviso los caracteres de subrayado coincidir con el alias de tabla de utilizar

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

Luego de arreglar su aplicación para usar la nueva tabla no normalizada, cambiar los puntos por guiones bajos.

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

Para la gran consultas de este modo se puede ahorrar un montón de tiempo y deja claro de dónde provienen los datos, y se pueden volver a utilizar las consultas que usted ya tiene.

Recuerde, sólo estoy defendiendo a este como el último recurso.Apuesto a que hay un par de índices que sería de ayuda.Y cuando se de-normalizar, no te olvides de cuenta para el extra de espacio en sus discos, y averiguar cuándo se va a ejecutar la consulta para rellenar las nuevas tablas.Esto probablemente debería ser en la noche, o cuando la actividad es baja.Y los datos de la tabla, por supuesto, nunca será exactamente a la fecha.

[Otra editar] no se olvide que las nuevas tablas de crear la necesidad de ser indexadas demasiado!La parte buena es que usted puede indexar el contenido de su corazón y no se preocupe acerca de la actualización de la contención de bloqueo, ya que, además de su inserción masiva en la tabla sólo ver selecciona.

Otros consejos

MySQL 5 apoyo vistas, que puede ser de ayuda en este escenario.Parece que ya he hecho un montón de optimización, pero si no se puede usar MySQL EXPLICAR la sintaxis para ver qué índices se utilizan y qué se está desacelerando sus consultas.

Tan lejos como ir sobre la normalización de los datos (si estás usando puntos de vista o simplemente duplicar los datos de una manera más eficiente), creo que empezar con la más lenta de las consultas y su forma de trabajo a través de es un buen enfoque para tomar.

Sé que esto es un poco tangencial, pero ¿has probado a ver si hay más índices se puede agregar?

No tengo una gran cantidad de DB de fondo, pero estoy trabajando con bases de datos mucho últimamente, y he sido encontrar que muchas de las consultas que se pueden mejorar mediante la adición de los índices.

Estamos utilizando DB2, y hay un comando llamado db2expln y db2advis, la primera indica si la mesa de exploraciones vs el análisis de índice están siendo utilizados, y el segundo se recomiendan los índices se pueden añadir para mejorar el rendimiento.Estoy seguro de que MySQL tiene herramientas similares...

De todos modos, si esto es algo que no he considerado embargo, ha estado ayudando mucho conmigo...pero si ya has ido esta ruta, entonces supongo que no es lo que usted está buscando.

Otra posibilidad es la de una "vista materializada" (o como lo llaman en DB2), que permite especificar una tabla que es esencialmente construido de piezas a partir de varias tablas.Así, en lugar de la normalización de las columnas reales, podría proporcionar este punto de vista para tener acceso a los datos...pero no sé si esto tiene graves impactos en el rendimiento en las inserciones o actualizaciones y eliminaciones (pero si es "materializado", entonces debe ayudar con los selects ya que los valores son almacenados físicamente por separado).

En línea con algunos de los otros comentarios, definitivamente, me gustaría echar un vistazo a su indexación.

Una cosa que he descubierto a principios de este año en nuestras bases de datos MySQL, era el poder de los índices compuestos.Por ejemplo, si usted está reportando en el orden de los números de más de rangos de fecha, un índice compuesto sobre el número de pedido y la fecha de la orden de las columnas pueden ser de ayuda.Creo MySQL sólo puede utilizar un índice para la consulta, por lo que si usted acaba de índices separados en el número de pedido y fecha en la que tendría que decidir en uno de ellos para su uso.Utilizando el EXPLICAR comando puede ayudar a determinar esto.

Para dar una indicación del rendimiento con buenos índices (incluyendo muchos de los índices compuestos), puedo ejecutar consultas de unirse a 3 tablas en nuestra base de datos y obtener resultados casi instantáneos en la mayoría de los casos.Para obtener más complejo de informes de la mayoría de las consultas se ejecutan en menos de 10 segundos.Estas 3 tablas han de 33 millones de 110 millones y 140 millones de filas respectivamente.Tenga en cuenta que nosotros ya había normalizado estos ligeramente para aumentar nuestra velocidad más común de consulta en la base de datos.

Más información acerca de las tablas y de los tipos de consultas de informes puede permitir más sugerencias.

Para MySQL me gusta a esta charla: Mundo Real Web:El Rendimiento Y La Escalabilidad, MySQL Edition.Este contiene una gran cantidad de diferentes consejos para conseguir más velocidad de MySQL.

También puede ser que desee considerar la posibilidad de seleccionar en una tabla temporal y, a continuación, realizar consultas en esa tabla temporal.Esto podría evitar la necesidad de volver a unir las tablas para cada consulta problema (suponiendo que usted puede utilizar la tabla temporal para numerosas consultas, por supuesto).Básicamente, esto le da sin normalizar los datos, pero si sólo hace seleccione llamadas, no hay preocupación acerca de la consistencia de los datos.

Además a mi respuesta anterior, otro enfoque que hemos adoptado en algunas situaciones es clave de almacén de datos de informes en distintas tablas de resumen.Hay ciertas consultas de informes que son sólo va a ser lento, incluso después de denormalising y optimizaciones, y hemos encontrado que la creación de una tabla y almacenamiento de ejecución totales o resumen de la información a lo largo del mes, ya que llegó en el final del mes de presentación de informes mucho más rápido así.

Hemos encontrado este enfoque fácil de implementar, ya que no romper nada de lo que ya estaba trabajando - es sólo la base de datos adicional inserta en determinados puntos.

He estado jugando con los índices compuestos y he visto algunos de los beneficios reales...tal vez voy a la instalación de algunas pruebas para ver si es que me puede salvar de aquí..al menos por un poco más de tiempo.

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