【发布时间】: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.uid和z.field_company_manager_uid -
你应该打破你的要求,而不是提出一个巨大的要求
-
我不认为这是@Zl3n 的问题。获得 1M 行的 94 次迭代?
-
使用 JOIN 指令,它会优化你的执行时间,见文档:w3schools.com/sql/sql_join.asp
标签: php mysql sql optimization