[英]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.