커버링 인덱스 얼마나 빨라지나 궁금

hongo·2024년 4월 18일
0

테스트를 위해 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개씩 있는 상황)

where boxId = N

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으로 인덱스 탐색 / 커버링 인덱스 사용하는 것도 확인

where boxId < 2001

조회해오는 데이터 양을 늘려보면 어떨까? 앞에서 ==조건은 총 5건의 row를 읽어온다. 10000개를 읽어오면 달라지지 않을까?

0.02330575 | select * from Present Where boxId < 10001
0.01321575 | select boxId from Present Where boxId < 10001

오... 2배 좀 안되게 빨라졌다

2만건 조회는?? 더 많이 조회하면??? 두근두근

  • 2만건 조회
    0.05142900 | select * from Present Where boxId > 400000
    0.02277350 | select boxId from Present Where boxId > 400000

오 ........

  • 6만건 조회
    0.20012975 | select * from Present Where boxId > 269467
    0.05553350 | select boxId from Present Where boxId > 269467

오........ 더 빨라짐

구글링 해보니까 1000만건 정도 데이터가 있을 때 5초에서 1초로 빨라진 케이스도 있었다...
데이터를 많이 조회해올 수록 빛을 발하는 듯

0개의 댓글