일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- useQuery
- DeleteAll
- 블로그 병행
- Blue-Green
- N+1
- 클래스
- mysql
- 월간회고
- 백기선 스터디
- 카카오 2차 코딩테스트
- InnoDB 버퍼 풀
- 프리코스
- 기능별 구조
- 멀티쓰레드 프로그래밍
- B+TREE
- db
- 주간회고
- java
- useMutation
- SQL 실행순서
- Jenkins
- 메서드명
- 우테코
- 회고
- 계층별 구조
- BalancedTree
- 어댑티브 해시 인덱스
- jacoco
- ci/cd
- 도커
- Today
- Total
Haneul's Blog
[DB] InnoDB 어댑티브 해시 인덱스 본문
InnoDB 어댑티브 해시 인덱스를 알아보기 전에 MySQL에서 데이터를 접근할 때 사용하는 방법에 대해서 간단하게 설명하고 넘어가겠습니다.
MySQL에서의 데이터 접근 방식
MySQL의 InnoDB 대표적인 인덱스는 B-Tree 자료구조를 사용합니다. 데이터는 Primary Key 순으로 정렬되어 관리되고, Secondrary Key는 인덱스키+PK 조합으로 정렬되어 있습니다.
특정 데이터를 찾기 위해서는 Secondrary Key에서 PK를 찾고, 그 PK를 통해 다시 원하는 데이터로 찾아가는 형태로 데이터가 처리됩니다. 트리의 가장 큰 강점은 데이터 접근 성능이 데이터가 증가하더라도 선형적으로 증가하지 않는다는 점입니다.
즉, 실제 데이터를 B-Tree 구조를 통해 찾을 때 Secondrary Key를 확인해서 PK를 찾기 -> PK를 통해 원하는 데이터로 찾아가기의 두 번의 과정을 걸쳐야 합니다.
데이터가 엄청나게 많아져도 데이터 접근에 소요되는 비용이 크게 증가하지 않아도 상황에 따라 효율이 좋지 않은 경우도 있습니다.
위에서 말했다시피 데이터를 접근할 때는 트리 구조를 따라가면서 데이터를 탐색해야 합니다. 이 말은 자주 사용되는 데이터들도 트리 경로를 따라가야 한다는 점입니다. 그렇게 되면 데이터가 많지만 사용되는 데이터는 한정되어 있을 때 이런 구조로 데이터에 접근하게 되면 데이터 접근 성능 효율이 떨어지게 됩니다.
InnoDB 어댑티브 해시 인덱스
위의 문제를 해결하기 위해서 나온 것이 InnoDB 어댑티브 해시 인덱스입니다. 이는 자주 사용되는 컬럼을 해시로 정의하여 B-Tree 경로를 따라가지 않고 바로 데이터에 접근할 수 있게 해주는 기능입니다.
모든 데이터들이 해시로 생성되는 것은 아니고 자주 사용되는 데이터를 내부적으로 판단하여 상황에 맞게 해시 값을 생성합니다.
이러한 어댑티브 해시 인덱스에 할당되는 메모리는 전체 InnoDB 버퍼 풀의 1/64만큼으로 초기화됩니다.
어댑티브 해시 인덱스는 자주 사용되는 자원을 해시를 통해 직접 접근하기 때문에, 내부적인 락으로 인한 지연이 줄어들며 B-Tree의 데이터 접근 비용인 O(LogN)에 비해 O(1)의 접근 비용이 들기 때문에 훨씬 빠른 속도로 데이터 처리가 가능해집니다.
참고 자료
https://tech.kakao.com/2016/04/07/innodb-adaptive-hash-index/
MySQL InnoDB의 Adaptive Hash Index 활용
개요 MySQL의 InnoDB에는 Adaptive Hash Index 기능이 있는데, 어떤 상황에서 효과가 있고 사용 시 반드시 주의를 해야할 점에 대해서 정리하도록 하겠습니다. InnoDB B-Tree 인덱스 MySQL의 InnoDB의 대표적인
tech.kakao.com
'DB' 카테고리의 다른 글
[DB] SELECT 쿼리 문법 및 실행 순서 (0) | 2022.11.04 |
---|---|
[DB] InnoDB 버퍼 풀 (0) | 2022.11.01 |
[DB] MySQL 메모리 할당 및 사용 구조 (0) | 2022.10.28 |
[DB] WAL(Write-Ahead-Logging) (0) | 2022.10.15 |
[DB] MySQL의 실행 구조 (0) | 2022.10.14 |