2013-10-04 102 views
1

在這裏我要優化SQL查詢如何優化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

你看到了嗎? http://stackoverflow.com/questions/950465/mysql-sql-big-selects連接字段上的索引?每張表有多少條記錄以及您希望返回多少條記錄?你有沒有在SELECT前面加一個EXPLAIN來看看MySQL將如何執行它? – AgRizzo

+0

感謝所有人,但有沒有任何查詢更改或只是索引是選項? ,我已經upvoted所有,再次感謝 – anytime

+0

這裏的主要問題是爲什麼你需要所有這些行(就你需要'SQL_BIG_SELECTS')?因爲如果您打算應用另外幾個條件或LIMIT子句,則會有另一個查詢。 – newtover

回答

1

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

1

連接中包含的兩個表之間的公共列應該編入索引。

2

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

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

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

的關鍵是:

1.You不應該需要的子查詢 - 只是做了直接連接和聚合

2.You應該能夠使用內部連接,這是典型的效率比外連接

+0

上述關鍵點如何與上述查詢相關? – newtover

0

從什麼其他人提到關於確保您加入的專欄的索引,我只有一個其他建議。有時,MySQL查詢優化器會嘗試使用其他表(如產品,品牌,用戶)作爲驅動表,根據這些表中較低的計數或任何其他可能的統計數據。

由於您的查詢看起來像所有其他的表是更多的「查找」僅供參考,您的調查表是關鍵的根表,只是改變

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

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

它告訴優化器做在您指定的順序。