들어가며

“Index 를 사용하면 쿼리 퍼포먼스가 좋아진다” 라는 소리는 들어본적 있을것입니다. 이번 포스팅에서는 이 Index 가 과연 얼마나 빠른지 확인해보는 과정을 적어보려고 합니다.

비교군 테이블 확인

Index 없는 테이블

우선 Index 가 없는 테이블 구조는 아래와 같습니다.

SHOW CREATE TABLE crew_participant;  
SHOW INDEX FROM crew_participant;
SELECT COUNT(id) FROM crew_participant;  

해당 테이블이 만들어진 DDL 은 아래와 같으며

PK 에서 만들어진 인덱스를 제외하면 어떠한 Index 도 없는 것을 확인할 수 있습니다.

그리고 해당 테이블는 총 400 만개의 row 가 존재하는 것을 알 수 있습니다.

Index 있는 테이블

Index 가 있는 테이블은 Index 가 없는 테이블을 복사 하고, crew_id, member_id 컬럼을 하나로 묶어 Unique Index(Multi Column Index) 를 추가해주었습니다.

CREATE TABLE 새로운_테이블명 LIKE 복사할_테이블명; 는 테이블 복사 시 제약조건까지 모두 복사합니다.

CREATE TABLE new_crew_participant LIKE crew_participant;  
INSERT INTO  
    new_crew_participant  
SELECT  
    *  
FROM  
    crew_participant;  
  
ALTER TABLE new_crew_participant  
    ADD UNIQUE INDEX crew_member_index (crew_id, member_id);

이제 Index 가 있는 테이블 구조는 아래와 같습니다.

SHOW CREATE TABLE new_crew_participant;  
SHOW INDEX FROM new_crew_participant;  
SELECT COUNT(id) FROM new_crew_participant;

DDL 쿼리에 Unique Index 가 생긴것을 확인할 수 있습니다.

그리고 PK 에서 만들어진 Index 를 제외하고도, Multi Column Index 가 생긴것을 확인할 수 있습니다.

마지막으로 정상적으로 복사에 성공해 동일하게 400 만개의 row 가 있는것을 확인할 수 있습니다.

테스트

이제 Index 가 없는 테이블과 Index 가 있는 테이블에 동일한 쿼리를 날려봅니다.

SET PROFILING = 1;  
SELECT * FROM crew_participant WHERE crew_id = 1700 AND member_id = 300;  
SELECT * from new_crew_participant WHERE crew_id = 1700 AND member_id = 300;  
SET PROFILING = 0;  
SHOW PROFILES;

프로파일링 결과 Index 가 없는 테이블은 0.54053425, Index 가 있는 테이블은 0.00025350 인것을 확인할 수 있습니다. 두 테이블 모두 400 만개의 row 가 있었지만 Index 여부로 2000 배 이상 차이나게 되는 것을 확인할 수 있습니다.