En nuestra aplicación, recopilamos datos sobre el rendimiento del motor automotriz, básicamente datos de origen sobre el rendimiento del motor en función del tipo de motor, el vehículo que lo ejecuta y el diseño del motor. Actualmente, la base para las nuevas inserciones de hileras es un período de encendido/apagado del motor; supervisamos las variables de rendimiento en función de un cambio en el estado del motor de activo a inactivo y viceversa. El relacionada engineState
tabla es el siguiente:En MySQL, ¿cuál es el diseño de consulta más efectivo para unir tablas grandes con muchas o muchas relaciones entre los predicados de unión?
+---------+-----------+---------------+---------------------+---------------------+-----------------+
| vehicle | engine | engine_state | state_start_time | state_end_time | engine_variable |
+---------+-----------+---------------+---------------------+---------------------+-----------------+
| 080025 | E01 | active | 2008-01-24 16:19:15 | 2008-01-24 16:24:45 | 720 |
| 080028 | E02 | inactive | 2008-01-24 16:19:25 | 2008-01-24 16:22:17 | 304 |
+---------+-----------+---------------+---------------------+---------------------+-----------------+
Para un análisis específico, nos gustaría analizar el contenido de la tabla en base a una granularidad fila de minutos, en lugar de la base actual del estado del motor activo/inactivo. Para esto, estamos pensando en crear una tabla simple productionMinute
con una fila por cada minuto en el período que estamos analizando y unir las tablas productionMinute
y engineEvent
en las columnas de fecha y hora de cada tabla. Entonces, si nuestro período de análisis es del 2009-12-01 al 2010-02-28, creamos una nueva tabla con 129.600 filas, una por cada minuto de cada día durante ese período de tres meses. Las primeras filas de la tabla productionMinute
:
+---------------------+
| production_minute |
+---------------------+
| 2009-12-01 00:00 |
| 2009-12-01 00:01 |
| 2009-12-01 00:02 |
| 2009-12-01 00:03 |
+---------------------+
La unión entre las tablas serían:
FROM engineState AS es
LEFT JOIN productionMinute AS pm ON pm.production_minute >= es.state_start_time
AND pm.production_minute <= es.event_end_time
esta unión, sin embargo, nos lleva a varios problemas ambientales:
- El
engineState
la tabla tiene 5 millones de filas y la tablaproductionMinute
tiene 130,000 filas - Cuando un
engineState
fila abarca más de un minuto (es decir la diferencia entrees.state_start_time
yes.state_end_time
es mayor que un minuto), como es el caso en el ejemplo anterior, hay varias filasproductionMinute
de mesa que se unen a una sola filaengineState
tabla - Cuando hay más de un motor en funcionamiento durante cualquier dado minutos, también como por el ejemplo anterior, múltiples
engineState
filas de la tabla se unen a un soloproductionMinute
fila
En la prueba de nuestra lógica y utilizando sólo un pequeño extracto de mesa (un día en lugar de 3 meses, para la tabla productionMinute
) la consulta tarda más de una hora en generar. Al investigar este ítem para mejorar el rendimiento para que sea factible consultar datos de tres meses, pensamos en crear una tabla temporal a partir del engineEvent
, eliminando cualquier información de tabla que no sea crítica para el análisis, y unirnos al tabla temporal a la tabla productionMinute
. También estamos planeando experimentar con diferentes combinaciones, específicamente una unión interna, para ver si eso mejoraría el rendimiento.
¿Cuál es el mejor diseño de consulta para unir tablas con la relación muchos: muchos entre los predicados de unión como se describe anteriormente? ¿Cuál es el mejor tipo de combinación (izquierda/derecha, interior)?
Un ejemplo concreto de qué tipo de informe está tratando de generar ayudaría. Es muy posible que no necesite ampliar las observaciones por minuto y pueda generar sus resultados directamente. Además, ¿qué índices tiene en su tabla engineState? – Martin
Sus quejas número 2 y 3 no son problemas ambientales, son problemas de diseño. Lo que quiero decir es que no puedo ver nada malo en ninguno de ellos; son ciertos porque usted ha establecido sus datos de esa manera. Debe describir por qué lo ve como un problema y dejar en claro qué espera de la unión que ha escrito (qué significado semántico le gustaría asignarle: D). – Unreason