如何优化sql join查询

时间:2013-10-04 13:19:12

标签: mysql 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 timeout),

所以如何优化此查询

请帮帮我

4 个答案:

答案 0 :(得分:2)

优化查询时总会考虑两件事:

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

  • 如何编写查询(您可能需要更改查询以允许查询优化器能够找到适当的索引,并且不会冗余地重新读取数据)

关键是:

1.您不应该需要子查询 - 只需进行直接连接和聚合

2.您应该能够使用INNER JOIN,这通常比OUTER JOIN更有效

答案 1 :(得分:1)

您必须为您在select语句中使用的列编制索引(brandId,productid,userid,mobile)

答案 2 :(得分:1)

连接中包含的两个表之间的公共列应该被编入索引。

答案 3 :(得分:0)

从其他人关于确保您加入的列的索引的注意事项,我只有另外一个建议。有时,MySQL查询优化器会尝试使用其他表之一(例如产品,品牌,用户)作为驱动表,基于这些表中的较低计数或其可能提供的任何其他统计数据。

由于您的查询看起来像所有其他表只是更多“查找”参考,并且您的Surveys表是关键的根表,只需更改

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

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

它告诉优化器按照你指定的顺序执行它。