2013-04-29 2 views
0

내가 2 개 MySQL의 서버MySQL은 5.0.51

이 perfomance 문제 5.1.66 대

서버 A는 MySQL은 5.0.51이 - 8기가바이트 RAM 단일 쿼드 코어 서버 B는 MySQL은 5.1.66을 가지고 - 64 기가 바이트 RAM - 배 쿼드 코어를 U가 서버 A에가 27초

에 완료

사용자로부터 다음 쿼리

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에서는 끝내지 않습니다. 400 초 동안 데이터를 보낸 후 방금 종료했습니다. 여기

서버의 구성 변수 인

join_buffer_size 131072
key_buffer_size 16777216
myisam_sort_buffer_size 8,388,608
net_buffer_length 16384
preload_buffer_size 32768
read_buffer_size 131072
read_rnd_buffer_size 262144
sort_buffer_size 2,097,144

및 서버 B

join_buffer_size 131072
key_buffer_size 16777216
myisam_sort_buffer_size 8,388,608
net_buffer_length 16384
preload_buffer_size 32768
read_buffer_size 131072
read_rnd_buffer_size 262144
sort_buffer_size 2,097,144
SQL_BUFFER_RESULT OFF

,745,151을 행 같은

더 빠르고 더 강력한 서버에서 왜 완료되지 않는지 알 수 없습니다.

온라인으로 몇 게시물을 찾았지만 모두 '색인 생성'문제라고 언급했으나 2 대의 컴퓨터간에 어떤 차이가 있는지를 짐작할 수 없었습니다. 오늘 아침 모든 색인과 모든 항목을 가지고 덤프를 가져 왔습니다. 다시 벌금을 벌었 어.

도움이 될 것입니다. 여전히 같은 -

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  

서버 코드 설명과

업데이트 나는 SESSION SQL_BUFFER_RESULT는 두 곳에서 설명 실행 = ON하기 전에 설정 결과!

+1

를 용서하십시오의'explain'을 - : 나는 당신이 일을하려고하지만, 이런 식으로 뭔가를 레코딩하려고하는 매우 것을 이해 확실하지

두 서버에서 쿼리하고 차이점을 찾습니다. 서버 설정은 다르다 - 서버 B는'sql_buffer_result'가 OFF로 설정되어있다. –

+0

'ANAL16' 열 이름에 대한 명성이 나를 괴롭혔다. –

+0

테이블 유형이 동일합니까? –

답변

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 

테스트 그리 오타에게

+0

제안에 감사드립니다. 쿼리는 보고서의 처음 몇 열입니다. 모든 것이 30 초 이내에 서버 A에서 실행되지만 서버 B에서는 완료되지 않습니다. 나는 그것을 떼어 놓았고 하위 쿼리에 추가하는 것이 실패했음을 발견했다. 더 효율적인지 확인하기 위해 아이디어를 얻으십시오. – JamesRedman

+0

각 서버에서 설정 한 색인이 다르다고 생각하거나 각 서버의 각 테이블에서 테이블 분석을 실행해야합니다. 원래 게시물에서 MySQL은 다른 가능한 키를 찾은 다음 다른 키를 선택했습니다. 위의 SQL은 성능 향상을위한 제안입니다 (두려워서 테이블에 100 % 확신 할 수 없으므로 정확히 원하는 것일 수 있습니다. 일반적으로 해당 쿼리 외부의 필드에 액세스하는 하위 쿼리가있는 경우 (상관 하위 쿼리)는 바깥 쿼리의 각 반환 된 행에 대해 실행될 때 잘못 수행됩니다. – Kickstart

+0

서버가 orignal 쿼리에서 계산중인 테이블을 포함하도록 SQL을 변경했습니다. 서버 A의 이전 코드가 27 초 내에 실행되었습니다. 이제 서버 B의 코드가 1.5 초 안에 완료되므로 제안에 감사드립니다! – JamesRedman