1

我想优化 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 超时),

那么如何优化这个查询

请帮我

4

4 回答 4

3

优化查询时总是需要考虑两件事:

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

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

关键是:

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

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

于 2013-10-04T13:33:20.837 回答
2

应该为连接中包含的两个表之间的公共列建立索引。

于 2013-10-04T13:25:00.097 回答
1

您必须索引您在选择语句中使用的列(brandId、productid、userid、mobile)

于 2013-10-04T13:23:07.430 回答
0

根据其他人关于确保您要加入的列的索引的内容,我只有另一个建议。有时,MySQL 查询优化器会尝试使用其他表之一(例如产品、品牌、用户)作为驱动表,基于这些表中的较低计数或它可能拥有的任何其他统计信息。

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

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

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

它告诉优化器按照您指定的顺序执行此操作。

于 2013-10-04T13:46:45.060 回答