La siguiente consulta funciona, pero es muy lenta para 10 registros (2 segundos). El perfilado dice que está creando una tabla tmp, pero no estoy seguro de por qué.MySQL - ¿Cómo se puede optimizar esta consulta?
Básicamente, me estoy uniendo al usuario actual, a los grupos acl, para obtener todos los grupos en los que están, unir los grupos a las empresas, obtener todas las empresas en las que están, unirme a las empresas a las órdenes , para obtener todos los órdenes ..
Si quito esta línea
ORDER BY orders.created_on DESC
continuación, la consulta se ejecuta en 0,06 segundos (más que aceptable) ..
Ayuda, alguna idea sobre cómo optimizar ? Muchas gracias :)
SELECT
orders.uuid,
companies.name as company_name
FROM
users u
JOIN
users_acl_groups g on u.uuid = g.user_uuid
JOIN
users_acl acl on (acl.user_uuid = u.uuid or acl.group_uuid = g.group_uuid)
JOIN
companies on acl.item_uuid = companies.uuid
JOIN
orders on companies.uuid = orders.company_uuid
WHERE
u.uuid = 'DDEC8073-5056-C000-01ED583A51CBCA32' and orders.status <> ''
ORDER BY orders.created_on DESC
limit 0, 10;
UPDATE, el explicar de la consulta ..
órdenes1 SIMPLE ALL 9403 Usando temporal; Usando filesort
1 SIMPLE acl ALL 1859 Usando where; Uso de la memoria tampón de unión
1 SIMPLE g ALL 2005 Using where; El uso de unirse a búfer
1 empresas SIMPLE eq_ref PRIMARIA PRIMARIA 52 table.orders.company_uuid 1
1 SIMPLE u all 33595 Uso de dónde; Distinto; Uso de unirse a tampón
Modificó su título, adivinando que le costó un voto negativo debido a su tono imperativo y exigente cuando su pregunta está bien redactada. –
Intenta usar la misma consulta con join aplicada en cualquier columna que no sea UID. Intente hacerlo con int, float, string, UID y observe la hora. Permítanos también saber si encuentra alguna variación. –
¿Tiene un índice en orders.created_on? Muestra el resultado en 'EXPLAIN' en tu consulta. Tal vez podrías beneficiarte de otros índices. Que 'EXPLAIN' nos dirá. – nos