Consultas de búsqueda lenta: codificación incorrecta, (UNIÓN IZQUIERDA)

Las malas consultas de búsqueda están colapsando nuestro sitio. La persona que escribió contó cada subcategoría y luego las sumó para obtener el total de las categorías principales. Para paginar Siguiente, Último, Páginas y luego las consultas se escriben con JOIN/INNER JOIN (de todos los productos de esa página). Está creando demasiados pasos y, por lo tanto, ralentiza todo hasta que se agota el tiempo. ¡Ayuda!

Resumen de la consulta:

SELECT COUNT(DISTINCT node.nid) AS cnt FROM 
content_type_product cp 
LEFT JOIN node node ON node.nid = cp.nid 
LEFT JOIN uc_products uc_products ON node.nid = uc_products.nid 
LEFT JOIN users users ON users.uid = node.uid 
LEFT JOIN files ON files.fid = cp.field_product_image_1_value 
LEFT JOIN content_type_product_tags ct ON ct.field_product_product_id_value = cp.nid 
WHERE 
    (
    node.status <> N
    ) 
AND 
    (
    ct.field_product_tag_id_value = N
    ) 
AND 
    (
    cp.field_deleted_value <> N
    ) 
AND 
    (
    cp.field_stock_level_value > N
    ) 
AND EXISTS 
    (
    SELECT scp.nid FROM content_type_store scp 
    LEFT JOIN node snode ON snode.nid = scp.nid 
    LEFT JOIN users susers ON susers.uid = snode.uid 
    WHERE susers.name = users.name 
        AND scp.field_shop_activated_value = 'S' 
        AND scp.field_shop_suspended_value = 'S') 
ORDER BY cp.field_product_last_changed_value DESC;

Ejemplo de consulta:

SELECT count(Distinct node.nid) as cnt 
FROM content_type_product cp 
LEFT JOIN node node ON node.nid = cp.nid 
LEFT JOIN uc_products uc_products ON node.nid = uc_products.nid 
LEFT JOIN users users ON users.uid = node.uid 
LEFT JOIN files ON files.fid = cp.field_product_image_1_value 
LEFT JOIN content_type_product_tags ct ON ct.field_product_product_id_value = cp.nid
WHERE 
    (
    node.status <> 0
    ) 
    AND 
        (
        ct.field_product_tag_id_value = 478
        ) 
    AND 
        (
        cp.field_deleted_value <> 1
        ) 
    AND 
        (
        cp.field_stock_level_value > 0
        ) 
    AND EXISTS 
        (
        SELECT scp.nid FROM content_type_store scp 
        LEFT JOIN node snode on snode.nid = scp.nid 
        LEFT JOIN users susers on susers.uid = snode.uid 
        WHERE susers.name = users.name 
            AND scp.field_shop_activated_value = '1' 
            AND scp.field_shop_suspended_value = '0'
        ) 
    ORDER BY cp.field_product_last_changed_value DESC

preguntado el 11 de junio de 12 a las 19:06

Sugeriría comenzar de nuevo con un diagrama de flujo en una hoja de papel. Primero escriba qué datos necesita mostrar en la página. Luego, escriba de qué tablas relevantes debe tomarse. Luego haga un diagrama de flujo para que comprenda qué se toma y cuándo y luego construya una consulta sobre esa base. Cuando adopta este enfoque, puede realizar una consulta compleja, sin perder de vista qué hace qué. -

Obtendrá ayuda más fácilmente si formatea las consultas correctamente para que sean más legibles. -

Como una pequeña pista adicional, su order by parece ser inútil; estás usando una función analítica. -

2 Respuestas

Agregue índices en la tabla principal y las tablas unidas ajustarán su consulta.

Respondido el 11 de junio de 12 a las 19:06

Estos son los siguientes pasos que debe seguir para evitar consultas lentas

  1. Primero comience desde el nodo en lugar de comenzar desde la tabla de contenido.
  2. Para la tabla de contenido, únase con vid en lugar de nid
  3. No es necesario usar distinct y group by en consulta Si está utilizando eso, su consulta tiene algún problema de unión.
SELECT count(Distinct node.nid) as cnt 
FROM node node 
LEFT JOIN content_type_product cp ON cp.vid = node.vid 
LEFT JOIN uc_products uc_products ON node.vid = uc_products.vid 
LEFT JOIN users users ON users.uid = node.uid 
LEFT JOIN files ON files.fid = cp.field_product_image_1_value 
LEFT JOIN content_type_product_tags ct ON ct.field_product_product_id_value = cp.vid
WHERE 
    (
    node.status <> 0
    ) 
    AND 
        (
        ct.field_product_tag_id_value = 478
        ) 
    AND 
        (
        cp.field_deleted_value <> 1
        ) 
    AND 
        (
        cp.field_stock_level_value > 0
        ) 
    AND EXISTS 
        (
        SELECT scp.nid FROM content_type_store scp 
        LEFT JOIN node snode on snode.nid = scp.nid 
        LEFT JOIN users susers on susers.uid = snode.uid 
        WHERE susers.name = users.name 
            AND scp.field_shop_activated_value = '1' 
            AND scp.field_shop_suspended_value = '0'
        ) 
    ORDER BY cp.field_product_last_changed_value DESC

Respondido el 12 de junio de 12 a las 12:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.