Back-End/DB
정렬 방식 실렬 방식 실습
Meluu_
2025. 7. 1. 13:06
3가지 정렬 방식
인덱스 사용
조인의 드라이빙 테이블만 정렬
임시 테이블 사용 후 정렬
3가지가 실제로 어떻게 적용되는지 궁금해서 직접 구현해봤다.
CREATE TABLE tb_test1 (
col1 int NOT NULL,
col2 int DEFAULT NULL,
PRIMARY KEY (col1),
INDEX ix_col1_col2 (col1,col2),
INDEX ix_col2 (col2)
) ENGINE=InnoDB
CREATE TABLE tb_test2 (
col1 int DEFAULT NULL,
col2 int DEFAULT NULL,
INDEX ix_col1_col2 (col1,col2)
) ENGINE=InnoDB
303p 의 퀴리문을보고 테이블을 만들었다.
해당 쿼리로 테스트 한다.
EXPLAIN SELECT *
FROM tb_test1 t1, tb_test2 t2
WHERE t1.col1 = t2.col1
ORDER BY t1.col2
LIMIT 10;
1번 인덱스 사용
INDEX ix_col1_col2 (col1,col2)
위의 인덱스만 생성할 경우
col1은 where 절에서 사용되었고 인덱스의 첫번째이므로 인덱스를 사용한 조인을 할 것이며
order by에서는 col1이 아닌 col2가 되었으므로 인덱스 정렬을 하지 않을 것이다.
쿼리 결과
extra 에 Using filesort가 출력되었다. 즉, 인덱스 정렬을 사용하지 않았다.
배운 대로라면 조인의 드라이빙 테이블만 정렬 한 것 같다.
이번에는 정렬 컬럼에 맞게된 2번 인덱스를 사용
INDEX ix_col2 (col2)
extra를 보니 인덱스 정렬이 된 것을 확인할 수 있다.
만약 인덱스가 없다면?
type = ALL, Using filesort가 뜬다.
즉 테이블 풀 스캔으로 모든 레코드를 가져온 다음 정렬 후 LIMIT 10개만 조인한다.
임시테이블 정렬
ORDER BY t2.col2
드리븐 테이블을 기준으로 정렬한다면 임시테이블 정렬을 실행한다.
Using temporary, filesort
임시테이블 생성후 조인 한 다음 정렬했다.
인덱스를 얼마나 잘 다뤄야하는지 느껴지는 실습이였다.
정렬 방법에 따라 조인 횟수와 정렬 건수가 또 다르고 많은 차이가 난다.
되도록이면 인덱스 정렬을 하게 유도하고
안되면 최소한 드라이빙 테이블 정렬 방식을 하도록 튜닝한다.