0

私は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))

ユーザーから U

サーバーAでは27秒で完了

サーバーBでは終了しません.400秒間データを送信した後、終了しました.

サーバーAの構成変数は次のとおりです

join_buffer_size 131072
key_buffer_size 16777216
myisam_sort_buffer_size 8388608
net_buffer_length 16384
preload_buffer_size 32768
read_buffer_size 131072
read_rnd_buffer_size 262144
sort_buffer_size 2097144

サーバーBからも同じ

join_buffer_size 131072
key_buffer_size 16777216
myisam_sort_buffer_size 8388608
net_buffer_length 16384
preload_buffer_size 32768
read_buffer_size 131072
read_rnd_buffer_size 262144
sort_buffer_size 20
OFF97144_result_sql_buffer

より高速ではるかに強力なサーバーで完了しない理由がわかりません。

オンラインでいくつかの投稿を見つけましたが、それらはすべて「インデックス作成」の問題であると述べていましたが、2 台のマシン間でどのように違いがあるのか​​ わかりません。今朝、すべてのインデックスを使用してダンプを取得し、すべて正常に再インポートしました.

どんな助けでも大歓迎です!

説明コードで更新

サーバーA

  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             TELCOM0473  9        func                                       1  Using where                                   
  4  DEPENDENT SUBQUERY  TC     ref   PRIMARY,TELCOM0472             PRIMARY     98       tms42_gg.S.ACCOUNT                      2273  Using where; Using temporary; Using filesort  
  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   

サーバー 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    

両方の場所で Explain を実行する前に SESSION SQL_BUFFER_RESULT= ON を設定しましたが、結果は同じです。

4

1 に答える 1

0

その 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 

未検証なので誤字脱字はご容赦ください

于 2013-04-29T15:51:02.120 に答える