SYSTEM PROGRAMMING

my sql 정렬 알고리즘

뉴암스테르담 2015. 8. 5. 21:20


my sql 정렬 알고리즘  시스템프로그래밍 

2013.03.14. 22:22  수정  삭제

복사http://blog.naver.com/pwk0810/40183818151

전용뷰어 보기

 

인덱스를 이용한 정렬

 

 

드라이빙테이블만 정렬

 

일반적으로 조인이 수행되면 결과 레코드의 건수가 몇배로 불어난다. 

그래서 조인을 실행하기 전에, 첫번째 테이블을 먼저 정렬한 다음 조인을 실행하는 것이 정렬의 차선책이 될것이다.

 

 

임시 테이블을 이용한 정렬

 

select *from employee e, salaries s

where s.emp_no = e.emp_no AND e.emp_no BETWEEN 100002 AND 100020

ORDER BY s.salary

 

- 2개 이상의 테이블 을 조인해서 그 결과를 정렬 해야 한다면 임시 테이블이 필요할수도 있다.

- 정렬해야 할 레코드 건수가 가장 많아지기 때문에 가장 느린 정렬 방법

 

ORDER BY 절의 정렬 기준 칼럼이 드라이빙 테이블이 아니라 드리븐 테이블에 있는 컬럼이다.

 

이를 EXPLAIN 해보면 EXTRA 컬럼에 Using where; using temporay; using filesort 코멘드가 나온다.

이는 조인 결과를 임시 테이블로 저장하고 그 결과를 다시 정렬 처리했음을 의미.

 

 

정렬 방식의 성능 비교


ORDER BY와 함계 LIMIT 를 사용하는 경우가 많은데, LIMIT 는 테이블이나 처리결과의 일부만을 가져오기 때문에 MYSQL 서버가 처리해야 할 작업량을 줄이는 역할을 한다.

 

그러나 ORDER BY 나 GROUP BY 같은 작업은 WHERE 조건을 만족하는 레코드를 LIMIT건수만큼만 가져와서 처리할수는 없다. 

우선 조건을 만족하는 레코드를 모두 가져와서 정렬을 수행하거나 그룹핑 작업을 실행해야만 비로소 LIMIT 로 건수 제한을 할수 있다.

 

WHERE 조건이 아무리 인덱스를 잘 활용하도록 튜닝해도 잘못된 ORDER BY 나 GROUP BY 때문에 커리가 느려지는 경우가 자주 발생.

 

 

  • 스트리밍 (streaming) 방식
    • 서버쪽에서 처리해야할 데이터가 얼마나 될지에 관계없이 조건에 일치하는 레코드가 검색될때마다 바로 바로 클라이언트에 전송되는 방식을 의미
    • 스트리밍 방식으로 처리되는 쿼리는 쿼리가 얼마나 많은 레코드를 조회하느냐에 상관없이 빠른 응답 시간을 보장해 준다.
    • 이방식으로 처리되는 쿼리에서 LIMIT와 같이 결과 건수에 제한하는 조건들은 쿼리의 전체 실행 시간을 상당히 줄여줄수 있다.
  • 버퍼링(buffering) 방식
    • ORDER BY 와 GROUP BY 와 같은 처리는 쿼리의 결과가 스트리밍 되는 것을 불가능하게 한다. 
    •  MYSQL 서버에서는 모든 레코드를 검색하고 정렬 작업을 하는 동안 클라이언트는 아무것도 하지 않고 기다려야 하기 때문에 응답 속도가 느림
    • 그렇기 때문에 LIMIT 처럼 결과 건수를 제한하는 조건이 있어도 성능 향상에 별로 도움이 되지 않는다.
ORDER BY 의 3가지 처리 방식 가운데 인덱스를 사용한 정렬 방식만 스트리밍 형태이며 나머지는 모두 버퍼링 된 후에 정렬된다.

SELECT *
FROM tb_test1 t1, tb_test2 t2
WHERE t1.col1 =t2.col1
ORDER BY t1.col2
LIMIT 10;

-> 레코드 건수 와 정렬 수행햐는 레코드 건수의 비교로 P.344 참조

어느 테이블이 먼저 드라이빙 되어 조인되는 지도 중요하지만 어떤 정렬 방식으로 처리되는 지도 큰 성능 차이를 만든다.

(인덱스 사용 - 드라이빙 테이블만 사용 - 임시 테이블을 사용한후 정렬 )

-> 최소한 드라이빙 테이블만 정렬해되는 수준으로 유도하는 것도 좋은 튜닝방법이라 할 수 있다.

정렬 관련 상태 변수