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

임시테이블 생성후 조인 한 다음 정렬했다.

 

 

인덱스를 얼마나 잘 다뤄야하는지 느껴지는 실습이였다.

정렬 방법에 따라 조인 횟수와 정렬 건수가 또 다르고 많은 차이가 난다.

 

되도록이면 인덱스 정렬을 하게 유도하고

안되면 최소한 드라이빙 테이블 정렬 방식을 하도록 튜닝한다.