【问题标题】:Slow Search Queries - Bad coding, (LEFT JOIN)缓慢的搜索查询 - 错误的编码,(左连接)
【发布时间】:2012-06-11 18:31:46
【问题描述】:

错误的搜索查询使我们的网站崩溃。写这个的人计算了每个子类别,然后将它们加在一起以获得主要类别的总数。 对于分页 Next、Last、Pages,然后使用 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

【问题讨论】:

  • 我建议从一张纸上的流程图​​重新开始。首先写下需要在页面上显示的数据。然后写下需要从哪些相关表中获取。然后制作一个流程图,以便您了解何时采取了什么,然后在此基础上构建一个查询。当您采用这种方法时,您可以进行复杂的查询,而不会忘记做什么。
  • 如果您正确格式化查询以使其更具可读性,您将更容易获得帮助。
  • 作为一个额外的提示,您的order by 似乎没用;您正在使用分析函数。

标签: php mysql drupal search


【解决方案1】:

在主表和连接表中添加索引将加快您的查询。

【讨论】:

    【解决方案2】:

    这里是需要遵循以下步骤以避免慢查询

    1. 首先从节点开始,而不是从内容表开始。
    2. 对于内容表加入vid 而不是nid
    3. 查询时无需使用distinct 和group 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
    

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多