2013-10-04 99 views
1

在这里我要优化SQL查询如何优化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

你看到了吗? http://stackoverflow.com/questions/950465/mysql-sql-big-selects连接字段上的索引?每张表有多少条记录以及您希望返回多少条记录?你有没有在SELECT前面加一个EXPLAIN来看看MySQL将如何执行它? – AgRizzo

+0

感谢所有人,但有没有任何查询更改或只是索引是选项? ,我已经upvoted所有,再次感谢 – anytime

+0

这里的主要问题是为什么你需要所有这些行(就你需要'SQL_BIG_SELECTS')?因为如果您打算应用另外几个条件或LIMIT子句,则会有另一个查询。 – newtover

回答

1

您必须索引您在使用的列select语句(brandId,productid,userid,mobile)

1

连接中包含的两个表之间的公共列应该编入索引。

2

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

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

  • 如何编写查询(您可能需要更改查询,以便查询优化器能够找到合适的索引,并且不重新读取数据冗余)

的关键是:

1.You不应该需要的子查询 - 只是做了直接连接和聚合

2.You应该能够使用内部连接,这是典型的效率比外连接

+0

上述关键点如何与上述查询相关? – newtover

0

从什么其他人提到关于确保您加入的专栏的索引,我只有一个其他建议。有时,MySQL查询优化器会尝试使用其他表(如产品,品牌,用户)作为驱动表,根据这些表中较低的计数或任何其他可能的统计数据。

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

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

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

它告诉优化器做在您指定的顺序。