簡體   English   中英

如何優化sql join查詢

[英]how to optimize sql join query

我想優化SQL查詢

SET SQL_BIG_SELECTS=1;
SELECT
    `Surveys`.`fname`
    , `Surveys`.`lname`
    , `Surveys`.`smobile`
    , `Surveys`.`semail`    
    , `Surveys`.`country`
    , `Surveys`.`city`    
    , `Surveys`.`sdob`
    , `Brand`.`brandname`
    , `Product`.`productname`        
    , `Surveys`.`outletcode`
    , `Surveys`.`outletname`
    , `Surveys`.`coupon_no`
    , `Users`.`username`
    , DATE_ADD(`Surveys`.datetime, INTERVAL 8 HOUR) as datetime
    , `Surveys`.`duration`    
    , userentry.couponcode as wcouponcode
    , userentry.couponcodecountry
    , userentry.prizename
    , DATE_ADD(userentry.datetime, INTERVAL 8 HOUR) as wdatetime    
FROM
    `Surveys`
    INNER JOIN `Brand` 
        ON (`Surveys`.`brandid` = `Brand`.`brandid`)
    INNER JOIN `Product` 
        ON (`Surveys`.`productid` = `Product`.`productid`) AND (`Surveys`.`brandid` = `Product`.`brandid`)    
    INNER JOIN `Users` 
        ON (`Surveys`.`userid` = `Users`.`userid`)
    INNER JOIN `userentry` 
        ON (`userentry`.`mobile` = `Surveys`.`smobile`)

這里如果沒有寫SET SQL_BIG_SELECTS = 1; 它不起作用

即使SQL_BIG_SELECTS到期(sql超時),

所以如何優化這個查詢

請幫我

優化查詢時總有兩件事需要考慮:

  • 可以使用哪些索引(您可能需要創建索引)

  • 如何編寫查詢(您可能需要更改查詢以允許查詢優化器能夠找到適當的索引,並且不會冗余地重新讀取數據)

關鍵是:

1.您不應該需要子查詢 - 只需進行直接連接和聚合

2.您應該能夠使用INNER JOIN,這通常比OUTER JOIN更有效

您必須索引在select語句中使用的列(brandId,productid,userid,mobile)

應該為連接中包含的兩個表之間的公共列建立索引。

從其他人關於確保您加入的列的索引的注意事項來看,我只有另外一個建議。 有時,MySQL查詢優化器將嘗試使用其他表之一(例如產品,品牌,用戶)作為驅動表,基於這些表中的較低計數或其可能具有的任何其他統計數據。

由於您的查詢看起來像所有其他表只是更多“查找”參考,並且您的Surveys表是關鍵的根表,只需更改

SELECT(...查詢的其余部分)

SELECT STRAIGHT_JOIN(...查詢的其余部分)

它告訴優化器按照您指定的順序執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM