繁体   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