Consultas de búsqueda lenta: codificación incorrecta, (UNIÓN IZQUIERDA)
Frecuentes
Visto 188 veces
-2
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
2 Respuestas
0
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
0
Estos son los siguientes pasos que debe seguir para evitar consultas lentas
- Primero comience desde el nodo en lugar de comenzar desde la tabla de contenido.
- Para la tabla de contenido, únase con
vid
en lugar denid
- No es necesario usar
distinct
ygroup 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 php mysql drupal search or haz tu propia pregunta.
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é. - Tschallacka
Obtendrá ayuda más fácilmente si formatea las consultas correctamente para que sean más legibles. - hannebaumsaway
Como una pequeña pista adicional, su
order by
parece ser inútil; estás usando una función analítica. - Ben