Mysql 如何优化sql连接查询
我想优化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` , `
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件事:
- 可以使用哪些索引(您可能需要创建索引)
- 如何编写查询(您可能需要更改查询,以使查询优化程序能够找到适当的索引,并且不会重复读取数据)
2.您应该能够使用内部连接,它通常比外部连接更有效,
在优化查询时总是要考虑2件事情:- 可以使用哪些索引(您可能需要创建索引)
- 如何编写查询(您可能需要更改查询,以使查询优化程序能够找到适当的索引,并且不会重复读取数据)
2.您应该能够使用内部联接,这通常比外部联接更有效根据其他人关于确保在您联接的列上建立索引的说明,我只有一个其他建议。有时,MySQL查询优化器会尝试使用其他表中的一个(如product、brand、user)作为驱动表,这是基于这些表中较低的计数或其他任何可用的统计数据 因为您的查询看起来像所有其他表都只是“查找”引用,而您的调查表是关键根表,所以只需更改即可 选择(…查询的其余部分) 到 选择直联(…查询的其余部分)
它告诉优化器按照您指定的顺序进行操作。根据其他人关于确保在您加入的列上建立索引的说明,我只有一个其他建议。有时,MySQL查询优化器会尝试使用其他表中的一个(如product、brand、user)作为驱动表,这是基于这些表中较低的计数或其他任何可用的统计数据 因为您的查询看起来像所有其他表都只是“查找”引用,而您的调查表是关键根表,所以只需更改即可 选择(…查询的其余部分) 到 选择直联(…查询的其余部分)
它告诉优化器按照您指定的顺序进行操作。您看到了吗?索引是否在联接字段上?每个表有多少条记录,您希望返回多少条记录?您是否在SELECT前面进行了解释,以了解MySQL将如何执行此操作?多谢大家,但是否有任何查询更改或只是索引选项,我已经把所有的都投了赞成票,再次感谢。这里的主要问题是为什么需要所有这些行(如果需要
SQL\u BIG\u SELECTS
)?因为如果您要应用另外两个条件或限制子句,您将有另一个查询。对于将来的代码:您不需要引用/反勾选列和表名称。它们只会增加视觉上的混乱,只是你犯语法错误的又一种方式。您需要它们的唯一原因是,如果您的名称是保留字,或者其中嵌入了空格或标点符号,那么无论如何都要避免这些糟糕的做法。查询看起来很棒(假设它返回您想要的记录)。通过使用内部联接,您将获得最佳性能。大多数注释和解决方案都在传递相同的信息-使用索引/索引优化表以提高读取性能看到了吗?索引是否在联接字段上?每个表有多少条记录,您希望返回多少条记录?您是否在SELECT前面进行了解释,以了解MySQL将如何执行此操作?多谢大家,但是否有任何查询更改或只是索引选项,我已经把所有的都投了赞成票,再次感谢。这里的主要问题是为什么需要所有这些行(如果需要SQL\u BIG\u SELECTS
)?因为如果您要应用另外两个条件或限制子句,您将有另一个查询。对于将来的代码:您不需要引用/反勾选列和表名称。它们只会增加视觉上的混乱,只是你犯语法错误的又一种方式。您需要它们的唯一原因是,如果您的名称是保留字,或者其中嵌入了空格或标点符号,那么无论如何都要避免这些糟糕的做法。查询看起来很棒(假设它返回您想要的记录)。通过使用内部联接,您将获得最佳性能。大多数注释和解决方案都在进行相同的通信—使用索引/索引优化表以提高读取性能