my sql 정렬 알고리즘
인덱스를 이용한 정렬
드라이빙테이블만 정렬
일반적으로 조인이 수행되면 결과 레코드의 건수가 몇배로 불어난다. 그래서 조인을 실행하기 전에, 첫번째 테이블을 먼저 정렬한 다음 조인을 실행하는 것이 정렬의 차선책이 될것이다.
임시 테이블을 이용한 정렬
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 때문에 커리가 느려지는 경우가 자주 발생.
ORDER BY 의 3가지 처리 방식 가운데 인덱스를 사용한 정렬 방식만 스트리밍 형태이며 나머지는 모두 버퍼링 된 후에 정렬된다. SELECT * FROM tb_test1 t1, tb_test2 t2 WHERE t1.col1 =t2.col1 ORDER BY t1.col2 LIMIT 10; -> 레코드 건수 와 정렬 수행햐는 레코드 건수의 비교로 P.344 참조 어느 테이블이 먼저 드라이빙 되어 조인되는 지도 중요하지만 어떤 정렬 방식으로 처리되는 지도 큰 성능 차이를 만든다. (인덱스 사용 - 드라이빙 테이블만 사용 - 임시 테이블을 사용한후 정렬 ) -> 최소한 드라이빙 테이블만 정렬해되는 수준으로 유도하는 것도 좋은 튜닝방법이라 할 수 있다. 정렬 관련 상태 변수 |