Usted está haciendo una combinación natural de 4 tablas. Además, en su declaración "DONDE", no hay condiciones especiales.
El motor de base de datos va a hacer lo siguiente:
lo hará primero un producto recursiva de todos los datos de cada tabla.
Considere las siguientes filas en las tablas A, B y C:
A = rowA1
rowA2
rowA3;
B = rowB1
rowB2
rowB3;
C = rowC1
rowC2
rowC3;
Básicamente, si lo hace unirse a un natural de las 3 mesas, el motor tendrá en la memoria:
rowA1 - rowB1 - rowC1
rowA1 - rowB1 - rowC2
rowA1 - rowB1 - rowC3
rowA1 - rowB2 - rowC1
rowA1 - rowB2 - rowC2
rowA1 - rowB2 - rowC3
rowA1 - rowB3 - rowC1
rowA1 - rowB3 - rowC2
rowA1 - rowB3 - rowC3
...
...
...
rowA3 - rowB3 - rowC1
rowA3 - rowB3 - rowC2
rowA3 - rowB3 - rowC3
En total, 27 filas se ponen en la memoria. Sin embargo, sólo queremos 3 filas:
rowA1 - rowB1 - rowC1
rowA2 - rowB2 - rowC2
rowA3 - rowB3 - rowC3
Si el motor de base de datos no hace optimización por sí mismo, se unen a un natural de la tabla 3 es muy caro. Para 4 tablas, es inconcebible, incluso para un número limitado de filas.
Ahora, ¿cómo podemos obtener algo mejor?
Primero, al mirar el código, sabemos que solo necesitamos 5 valores. Además, en la optimización de la base de datos, se dice que debe hacer SELECCIONAR lo más temprano posible.
Aquí hay algunos códigos no probados que deberían ser de ayuda. Puede que tenga que modificarlo, dependiendo de qué motor de base de datos que está utilizando:
SELECT *
FROM (SELECT * FROM equipment LIMIT 5) e, tiremap, workreference, tirework
WHERE e.tiremap = tiremap.TireID AND
tiremap.WorkMap = workreference.`aMap` AND
workreference.`bMap` = tirework.workmap
Sólo al hacer esto, se debe sentir como que tenía sólo 3 mesas, y no 4. Sin embargo, esto no es realmente lo que querer. Si una fila de "equipo" no está referenciada en las otras tablas, obtendrá menos de 5 filas al final. Sin embargo, este es un ejemplo para mostrarle que tal vez no necesitemos todas las filas de todas las tablas.
Ahora, lo que creo que quieren que podría ser la siguiente:
SELECT * FROM equipment
INNER JOIN tiremap ON equipment.tiremap = tiremap.TireID
INNER JOIN workreference ON tiremap.WorkMap = workreference.aMap
INNER JOIN tirework ON workreference.bMap = tirework.workmap
LIMIT 5
Es posible que haya un problema aquí: si el motor no es tan bueno (MySQL, lo siento), puede tomar mucho tiempo.
Si realmente quiere hacer la optimización de sí mismo:
SELECT * FROM tirework,
(SELECT * FROM workreference,
(SELECT * FROM tiremap,
(SELECT * FROM equipment) e
WHERE e.tiremap = tiremap.TireID) t
WHERE t.WorkMap = workreference.aMap) w
WHERE w.bMap = tirework.workmap
LIMIT 5
y listo! Incluso si su optimizador del motor no existe, esa consulta no debería tomar demasiado tiempo. En lugar de hacer un gran producto de todo, su motor hará un producto a la vez y obtendrá las malas filas antes de unirse a ella con una nueva tabla.
Pruébalo.
¿Siempre es la misma tabla que excluye para que funcione? En otras palabras, ¿puede hacer que funcione con 3 de las 4 tablas posibles? ¿O es 1 tabla particular que siempre es el problema? – MusiGenesis
¿Ha ejecutado esto a través de EXPLAIN para ver qué está haciendo? Ese debería haber sido tu primer paso. – ryeguy
@MusiGenesis, pude ejecutar el sql a una velocidad decente durante las primeras 3 tablas, pero una vez que comencé a unirme con el trabajo de neumáticos, parece congelarse y nunca responder, ¿cuál crees que es el problema? – colorfulgrayscale