2015-09-10 120 views
1

我有以下查詢,花了我2​​秒鐘執行,現在需要大約10分鐘,因爲我在表custom_redemptions中添加了100個以上的條目,而在另一個表中又增加了10個左右。SQL查詢優化 - 執行時間

隨着DISTINCT它返回我

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

我拿出DISTINCT來跟蹤bug,它返回我

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) 
+2

你知道你做** CARTESIAN產品**與大規模'WHERE'?它基本上意味着您的中間結果將具有尺寸SIZE(users_roles)x SIZE(field_data_field_ypefthinos)x ... x SIZE(field_data_field_brand_company)。 – lad2025

+0

嘗試使用JOIN來結合例如''a.uid''和''z.field_company_manager_uid'' –

+0

你應該打破你的請求,而不是做一個巨大的 – Zl3n

回答

0

第1步。您有4條件的OR。將查詢轉換爲,每個都有OR條件之一。

第2步。刪除每個SELECT(以擺脫笛卡爾產品)未使用的表。

第3步。將INDEX(uid, rid)(以任意順序)加到a