Mysql 如何优化sql连接查询

Mysql 如何优化sql连接查询,mysql,sql,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` , `

我想优化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\u BIG\u SELECTS=1;它不起作用

即使使用SQL\u BIG\u选择其过期(SQL超时)

那么如何优化这个查询呢


请帮助我

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

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

< p>连接中包含的表之间的公共列应该被索引。

在连接中包含的表之间的公共列应该被索引。

在优化查询时总是要考虑2件事:

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

  • 如何编写查询(您可能需要更改查询,以使查询优化程序能够找到适当的索引,并且不会重复读取数据)

关键是:

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


2.您应该能够使用内部连接,它通常比外部连接更有效,

在优化查询时总是要考虑2件事情:

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

  • 如何编写查询(您可能需要更改查询,以使查询优化程序能够找到适当的索引,并且不会重复读取数据)

关键是:

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


2.您应该能够使用内部联接,这通常比外部联接更有效

根据其他人关于确保在您联接的列上建立索引的说明,我只有一个其他建议。有时,MySQL查询优化器会尝试使用其他表中的一个(如product、brand、user)作为驱动表,这是基于这些表中较低的计数或其他任何可用的统计数据

因为您的查询看起来像所有其他表都只是“查找”引用,而您的调查表是关键根表,所以只需更改即可

选择(…查询的其余部分)

选择直联(…查询的其余部分)


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

根据其他人关于确保在您加入的列上建立索引的说明,我只有一个其他建议。有时,MySQL查询优化器会尝试使用其他表中的一个(如product、brand、user)作为驱动表,这是基于这些表中较低的计数或其他任何可用的统计数据

因为您的查询看起来像所有其他表都只是“查找”引用,而您的调查表是关键根表,所以只需更改即可

选择(…查询的其余部分)

选择直联(…查询的其余部分)


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

您看到了吗?索引是否在联接字段上?每个表有多少条记录,您希望返回多少条记录?您是否在SELECT前面进行了解释,以了解MySQL将如何执行此操作?多谢大家,但是否有任何查询更改或只是索引选项,我已经把所有的都投了赞成票,再次感谢。这里的主要问题是为什么需要所有这些行(如果需要
SQL\u BIG\u SELECTS
)?因为如果您要应用另外两个条件或限制子句,您将有另一个查询。对于将来的代码:您不需要引用/反勾选列和表名称。它们只会增加视觉上的混乱,只是你犯语法错误的又一种方式。您需要它们的唯一原因是,如果您的名称是保留字,或者其中嵌入了空格或标点符号,那么无论如何都要避免这些糟糕的做法。查询看起来很棒(假设它返回您想要的记录)。通过使用内部联接,您将获得最佳性能。大多数注释和解决方案都在传递相同的信息-使用索引/索引优化表以提高读取性能看到了吗?索引是否在联接字段上?每个表有多少条记录,您希望返回多少条记录?您是否在SELECT前面进行了解释,以了解MySQL将如何执行此操作?多谢大家,但是否有任何查询更改或只是索引选项,我已经把所有的都投了赞成票,再次感谢。这里的主要问题是为什么需要所有这些行(如果需要
SQL\u BIG\u SELECTS
)?因为如果您要应用另外两个条件或限制子句,您将有另一个查询。对于将来的代码:您不需要引用/反勾选列和表名称。它们只会增加视觉上的混乱,只是你犯语法错误的又一种方式。您需要它们的唯一原因是,如果您的名称是保留字,或者其中嵌入了空格或标点符号,那么无论如何都要避免这些糟糕的做法。查询看起来很棒(假设它返回您想要的记录)。通过使用内部联接,您将获得最佳性能。大多数注释和解决方案都在进行相同的通信—使用索引/索引优化表以提高读取性能