我想优化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),
所以如何优化此查询
请帮帮我
答案 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(...查询的其余部分)
它告诉优化器按照你指定的顺序执行它。