【问题标题】:SQL Query optimization - exec timeSQL 查询优化 - 执行时间
【发布时间】:2015-09-11 12:29:48
【问题描述】:

我有以下查询,执行需要 2 秒,现在需要大约 10 分钟,因为我在 custom_redemptions 表中添加了 100 个条目,在每个其他表中添加了大约 10 个条目。

DISTINCT 它返回给我

Showing rows 0 - 29 (96 total, Query took 0.00156 sec)

我拿出DISTINCT 来跟踪这个错误,它返回了我

 Showing rows 0 - 29 (94174080 total, Query took 0.1510 sec)

有什么办法可以优化吗?

SELECT DISTINCT c.id, c.couponid, c.branchid, c.chainid
FROM `users_roles` a,
     `field_data_field_ypefthinos` b,
     `custom_redemptions` c,
     `field_data_field_chain_manager` e,
     `field_data_field_node_tax_inception` f,
     `field_data_field_brand_manager` j,
     `field_data_field_brand_node_ref` k,
     `field_data_field_product_ref` i,
     `field_data_field_company_manager` z,
     `field_data_field_brand_company` t
WHERE (a.rid = 4
       AND a.uid = 351
       AND b.field_ypefthinos_uid = a.uid
       AND b.entity_id = c.branchid)
   OR
      (a.rid = 5
       AND a.uid = 351
       AND e.field_chain_manager_uid = a.uid
       AND e.entity_id = f.entity_id
       AND f.field_node_tax_inception_tid = c.chainid)
   OR
      (a.rid = 9
       AND a.uid = 351
       AND j.field_brand_manager_uid = a.uid
       AND j.entity_id = k.field_brand_node_ref_nid
       AND k.entity_id = i.field_product_ref_nid
       AND i.entity_id = c.couponid)
   OR
      (a.rid = 6
       AND a.uid = 351
       AND z.field_company_manager_uid = a.uid
       AND z.entity_id = t.field_brand_company_nid
       AND t.entity_id = k.field_brand_node_ref_nid
       AND k.entity_id = i.field_product_ref_nid
       AND i.entity_id = c.couponid)

【问题讨论】:

  • 你知道你用大量的WHERE笛卡尔积吗?这基本上意味着您的中间结果将具有大小 SIZE(users_roles) x SIZE(field_data_field_ypefthinos) x...x SIZE(field_data_field_brand_company)。
  • 尝试使用 JOIN 来组合例如a.uidz.field_company_manager_uid
  • 你应该打破你的要求,而不是提出一个巨大的要求
  • 我不认为这是@Zl3n 的问题。获得 1M 行的 94 次迭代?
  • 使用 JOIN 指令,它会优化你的执行时间,见文档:w3schools.com/sql/sql_join.asp

标签: php mysql sql optimization


【解决方案1】:

第 1 步。您有 4 个条件中的 OR。将查询转换为 4 个SELECTs 中的UNION,每个都具有OR 条件之一。

第 2 步。删除每个 SELECT 中未使用的表(以摆脱笛卡尔积)。

第 3 步。将INDEX(uid, rid)(以任意顺序)添加到a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2018-08-21
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多