Mysql 5.0.51 vs 5.1.66性能问题

Mysql 5.0.51 vs 5.1.66性能问题,mysql,performance,query-performance,Mysql,Performance,Query Performance,我有2台mysql服务器 服务器A有mysql 5.0.51-8GB RAM单四核 服务器B有mysql 5.1.66-64GB RAM-2x四核 运行以下查询 select FULLNAME ,(select COUNT(*) FROM ORDERS S, ACCOUNTS T WHERE S.CREATED BETWEEN '2013-04-21 00:00' AND '2013-04-27 23:59' AND S.ACCOUNT=T.ACCOUNT AND T.USERNAME=U

我有2台mysql服务器

服务器A有mysql 5.0.51-8GB RAM单四核 服务器B有mysql 5.1.66-64GB RAM-2x四核

运行以下查询

 select FULLNAME ,(select COUNT(*) FROM ORDERS S, ACCOUNTS T WHERE S.CREATED BETWEEN  '2013-04-21 00:00' AND '2013-04-27 23:59'  AND S.ACCOUNT=T.ACCOUNT AND T.USERNAME=U.USERNAME AND T.CUSTOMERSTATUS = 'Donation'
     and T.TIMEST=
      (SELECT TC.TIMEST FROM  DETAILS A, ACCOUNTS TC WHERE S.ACCOUNT=A.ACCOUNT AND A.ACCOUNT = TC.ACCOUNT AND T.USERNAME=U.USERNAME AND T.CUSTOMERSTATUS = 'Donation' AND A.ANAL16 <> 'Cheque' order by TIMEST DESC LIMIT 1))
服务器B

|  1 | PRIMARY            | U     | ALL   | NULL                                      | NULL       | NULL    | NULL                                   |   57 | Using where; Using temporary; Using filesort |
|  3 | DEPENDENT SUBQUERY | S     | ALL   | PRIMARY,ACCSTO0472                        | NULL       | NULL    | NULL                                   | 3948 | Using where; Using temporary                 |
|  3 | DEPENDENT SUBQUERY | T     | ref   | PRIMARY,TELCOM0473,TELCOM047J,TELCOM047JR | TELCOM0473 | 9       | func                                   |    1 | Using where                                  |
|  4 | DEPENDENT SUBQUERY | TC    | index | PRIMARY,TELCOM0472,TELCOM047J,TELCOM047JR | TELCOM0473 | 9       | NULL                                   |    1 | Using where; Using temporary                 |
|  4 | DEPENDENT SUBQUERY | A     | ref   | PRIMARY,RCMANL0472,RCMANL0473             | RCMANL0473 | 98      | tms42_gg.S.ACCOUNT                     |    1 | Using where; Using index                     |
|  2 | DEPENDENT SUBQUERY | R     | ALL   | PRIMARY                                   | NULL       | NULL    | NULL                                   |  636 | Using where; Using temporary                 |
|  2 | DEPENDENT SUBQUERY | T     | ref   | PRIMARY,ACCSTO0122                        | ACCSTO0122 | 250     | tms42_gg.R.ACCOUNT,tms42_gg.U.USERNAME |    1 | Using where    

在两个位置运行解释之前,我将会话SQL\u BUFFER\u RESULT=设置为打开-结果仍然相同

使用嵌套的相关查询,SQL看起来效率很低

不确定我是否完全理解了您要做的事情,但请尝试将其重新编码如下:-

SELECT U.FULLNAME , Sub2.RecCount
FROM USERS U
LEFT OUTER JOIN (select T.USERNAME, COUNT(*) AS RecCount
FROM ORDERS S
INNER JOIN ACCOUNTS T ON S.ACCOUNT = T.ACCOUNT 
INNER JOIN (SELECT A.ACCOUNT, MAX(TC.TIMEST) AS MaxTimeSt
      FROM  DETAILS A
      INNER JOIN ACCOUNTS TC ON A.ACCOUNT = TC.ACCOUNT
      WHERE A.ANAL16 != 'Cheque' 
      GROUP BY A.ACCOUNT) Sub1 ON S.ACCOUNT = Sub1.ACCOUNT AND T.TIMEST = Sub1.MaxTimeSt
WHERE S.CREATED BETWEEN  '2013-04-21 00:00' AND '2013-04-27 23:59'  
AND T.USERNAME = U.USERNAME 
AND T.CUSTOMERSTATUS = 'Donation' 
GROUP BY T.USERNAME) Sub2
ON Sub2.USERNAME = U.USERNAME 

未测试,因此请原谅任何打字错误

在两台服务器上对查询进行解释,并查找差异。请注意,您的服务器配置不同-服务器B已将
sql\u buffer\u result
设置为OFF。对于
ANAL16
列名,让我窃笑。你的表类型相同吗?表类型都是MyISAM-现在就发布解释输出可能值得在重试解释之前在每台服务器上的每个表上运行ANALYZE table。感谢你的建议-查询是报表中的前几列-整个过程在服务器a上运行不到30秒,但在服务器B没有完成。我把它拆开,发现子查询中的添加导致它失败,这就是我在这里发布的内容。尝试您的想法,看看它是否能提高效率我怀疑您在每台服务器上设置的索引是不同的,和/或您需要在每台服务器上的每个表上运行analyze table。在您的原始帖子中,MySQL找到了不同的可能键,然后选择了不同的键。上面的SQL是一个提高性能的建议(恐怕我不能100%确定您的表,所以我不能确定它是否正是您想要的。通常有一个子查询访问该查询之外的字段(相关子查询)将执行糟糕的操作,因为它将针对外部查询的每个返回行执行。我更改了SQL以将其计数的表包含在原始查询中。服务器A上的旧代码在27秒内运行。服务器B上的新代码现在在1.5秒内完成,因此感谢您的建议!
SELECT U.FULLNAME , Sub2.RecCount
FROM USERS U
LEFT OUTER JOIN (select T.USERNAME, COUNT(*) AS RecCount
FROM ORDERS S
INNER JOIN ACCOUNTS T ON S.ACCOUNT = T.ACCOUNT 
INNER JOIN (SELECT A.ACCOUNT, MAX(TC.TIMEST) AS MaxTimeSt
      FROM  DETAILS A
      INNER JOIN ACCOUNTS TC ON A.ACCOUNT = TC.ACCOUNT
      WHERE A.ANAL16 != 'Cheque' 
      GROUP BY A.ACCOUNT) Sub1 ON S.ACCOUNT = Sub1.ACCOUNT AND T.TIMEST = Sub1.MaxTimeSt
WHERE S.CREATED BETWEEN  '2013-04-21 00:00' AND '2013-04-27 23:59'  
AND T.USERNAME = U.USERNAME 
AND T.CUSTOMERSTATUS = 'Donation' 
GROUP BY T.USERNAME) Sub2
ON Sub2.USERNAME = U.USERNAME