어댑티브 해시 인덱스
InnoDB 스토리지 엔진에서 사용자가 자주 요청하는 데이터에 대해 자동으로 생성하는 인덱스이다.
B-Tree 인덱스 VS 어댑티스 해시 인덱스
어댑티브 해시 인덱스는 B-Tree의 검색 시간을 줄여주기 위해 도입되었다.
일반적인 인덱스는 B-Tree로 되어있다. B-Tree는 데이터 탐색을 위해 Root부터 Branch를 거쳐 Leaf까지 탐색을 해야한다.
하지만 해시 인덱스는 데이터를 즉시 찾아갈 수 있다.
해시 인덱스는 인덱스 키 값과 해당 인덱스 키 값이 저장된 데이터 페이지 주소의 쌍으로 관리된다.
인덱스 키 값은 B-Tree 인덱스의 고유 번호와 B-Tree 인덱스의 실제 키 값 조합으로 생성된다. 즉, 모든 B-Tree 인덱스는 하나의 어댑티브 해시 인덱스에 저장되며, 특정 키 값이 어느 B-Tree 인덱스에 속한 것인지도 구분한다.
데이터 페이지 주소는 실제 키 값이 저장된 데이터 페이지의 메모리 주소를 가진다. 이는 InnoDB 버퍼 풀에 로딩된 페이지 주소를 의미한다. 따라서 버퍼 풀에 올려진 데이터 페이지가 없어지면 어댑티브 해시 인덱스도 해당 페이지의 정보를 삭제한다.
예전 버전까지는 어댑티브 해시 인덱스는 하나의 메모리 객체라서 어댑티브 해시 인덱스의 경합이 심했다. MySQL 8.0 버전부터 내부 잠금을 줄이기 위해 어댑티브 해시 인덱스 파티션 기능을 제공한다.
어댑티브 해시 인덱스에 따른 성능 향상
다음과 같은 경우 성능 향상에 도움이 된다.
- 디스크의 데이터가 InnoDB 버퍼 풀 크기와 비슷한 경우(디스크 읽기가 많지 않은 경우)
- 동등 조건 검색이 많은 경우
- 쿼리가 일부 데이터에만 집중되는 경우
다음과 같은 경우 성능 향상에 도움이 되지 않는다.
- 디스크 읽기가 많은 경우
- 특정 패턴의 쿼리가 많은 경우: 조인, LIKE 패턴 검색
- 매우 큰 데이터를 가진 테이블의 레코드를 폭넓게 읽는 경우
어댑티스 해시 인덱스는 데이터 페이지를 버퍼 풀 내에서 접근하는 것을 빠르게 하는 것이다. 디스크로 읽어오는 경우를 도와주지 않는다. 어댑티브 해시 인덱스 또한 메모리를 사용하기 때문에 때로는 상당히 큰 메모리 공간이 사용될 수 있다. 데이터 페이지의 인덱스 키가 해시 인덱스로 만들어지기 때문에 불필요한 경우 제거돼야 하며, 어댑티브 해시 인덱스가 활성화되면 그 키값이 있든 없든 해시 인덱스를 검색해본다.
테이블 삭제
어댑티브 해시 인덱스는 테이블의 삭제 작업에도 많은 영향을 미친다. 특정 테이블의 인덱스가 어댑티브 해시 인덱스로 적재되어 있을 때, 해당 테이블을 삭제하거나 변경하면 InnoDB는 해당 데이터 페이지의 해시 인덱스를 제거한다.
모니터링
어댑티브 해시 인덱스가 도움이 되는지 아닌지는 MySQL 서버의 상태 값들을 살펴 보는 것으로 판단할 수 있다.
mysql> SHOW ENGINE INNODB STATUS\G
어댑티브 해시 인덱스의 효율은 해시 인덱스 히트율과 어댑티브 해시 인덱스가 사용중인 메모리 공간, 서버의 CPU 사용량을 종합해서 판단해야 한다.
'Database' 카테고리의 다른 글
[MySQL] 잠금 (0) | 2023.03.15 |
---|---|
[MySQL] 트랜잭션 (0) | 2023.03.08 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 - 3 (0) | 2023.02.08 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 - 2 (2) | 2023.02.01 |
[MySQL] InnoDB 스토리지 엔진 아키텍처 - 1 (0) | 2023.01.11 |