2012-06-11 31 views
-2

错误的搜索查询正在导致我们的网站崩溃。编写计数每个子类别的人,然后将它们加在一起以获得主要类别的总数。 对于分页接下来,最后,页面,然后用JOIN/INNER JOIN(该页面的所有产品)编写查询。它创造了太多的步骤,从而放慢了一切,直到它超时。帮帮我!慢搜索查询 - 错误的编码,(左连接)

查询摘要:

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; 

查询样品:

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

我建议从一张纸上的流程图​​开始。首先写下你需要在页面上显示的数据。 然后写下需要采取的相关表格。 然后制作流程图,以便了解在此基础上采取何种措施并随后生成查询。 当你采取这种方法时,你可以做一个复杂的查询,而不会失去跟踪什么。 – Tschallacka

+2

如果您正确格式化查询以便更易读,您将更容易获得帮助。 – hannebaumsaway

+0

作为一点额外的提示,你的'order by'似乎是无用的;您正在使用分析功能。 – Ben

回答

0

添加在主表的索引和连接表,可加快查询。

0

这里是下面的步骤需要遵循,以避免慢查询从节点,而不是从内容表开始

  1. 第一次启动。
  2. 对于内容表连接与vid代替nid
  3. 无需在查询中使用distinctgroup by。如果您使用的是您的查询有一些连接问题。
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