Mysql 5.0.51 vs 5.1.66性能问题
我有2台mysql服务器 服务器A有mysql 5.0.51-8GB RAM单四核 服务器B有mysql 5.1.66-64GB RAM-2x四核 运行以下查询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
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