테스트를 위해 MySQL 8.0 innodb에 Present
라는 테이블 생성!
CREATE TABLE Present (
id BIGINT,
boxId BIGINT,
name VARCHAR(255),
amount INT
);
(ㅎㅎ 테이블 앞글자가 대문자 & 컬럼명이 카멜케이스인건 봐주세요)
컬럼 boxId
에 인덱스를 걸어서 커버링 인덱스를 테스트해보아요~
Present
를 20만개 만들고 유니크한 boxId
를 4만개 만들었습니다. (동일한 boxId를 가지는 row가 5개씩 있는 상황)
0.00087400 | select * from Present where boxId = 3000
0.00106400 | select boxId from Present where boxId = 3000
오잉? 왜 커버링 인덱스인 두 번째가 더 느린거지...
여러 번 해봤는데 둘이 비슷비슷하다. select boxId가 더 빠를 때도 있고, select * 이 더 빠를 때도 있다.
SQL_NO_CACHE로 쿼리 캐시를 없애고, flush tables를 통해 innodb 버퍼 캐시도 없앤 상태에서도 진행해보았다.
0.00099225 | SELECT SQL_NO_CACHE boxId FROM Present WHERE boxId = 3000
0.00050150 | SELECT SQL_NO_CACHE * FROM Present WHERE boxId = 3000
비슷비슷~
explain으로 인덱스 탐색 / 커버링 인덱스 사용하는 것도 확인
조회해오는 데이터 양을 늘려보면 어떨까? 앞에서 ==조건은 총 5건의 row를 읽어온다. 10000개를 읽어오면 달라지지 않을까?
0.02330575 | select * from Present Where boxId < 10001
0.01321575 | select boxId from Present Where boxId < 10001
오... 2배 좀 안되게 빨라졌다
0.05142900 | select * from Present Where boxId > 400000
0.02277350 | select boxId from Present Where boxId > 400000
오 ........
0.20012975 | select * from Present Where boxId > 269467
0.05553350 | select boxId from Present Where boxId > 269467
오........ 더 빨라짐
구글링 해보니까 1000만건 정도 데이터가 있을 때 5초에서 1초로 빨라진 케이스도 있었다...
데이터를 많이 조회해올 수록 빛을 발하는 듯