Adaptive Hash Index

Overview

RDBMS에서 대부분의 경우 일반적으로 사용되는 자료 구조는 B-Tree 입니다.

Primary Key 순으로 정렬하여 관리하고 Secondrary Key는 인덱스키 + PK를 조합하여 정렬하고있습니다.

데이터의 사이즈가 커져도 특정 데이터 접근에 소요되는 비용이 크게 증가되지 않기 때문입니다.

또 노드의 삽입, 삭제 후 에도 균형 트리 유지로 균등한 응답속도 보장하고 효율적인 알고리즘 제공합니다.

PK로 접근 시 데이터 접근에 소요되는 비용은 O(logN)이고,

두번째 트리에 접근하는 Secondrary Key에 소요되는 비용은 2 * O(logN)입니다.

단점도 존재하는데, 삽입과 삭제시 트리의 균형을 유지하기 위해 복잡한 연산(재분배,합병)이 필요

(½일 때 분열이 일어남, 2/3일 때 분열이 되는 B*TREE 활용)합니다.

또한 Mutex Lock이 과도하게 생성되면 적은 데이터 셋에도 자원 사용 효율이 감소하게 됩니다.
_자주 사용되는 데이터 탐색에도 불구하고 매번 트리의 경로를 쫓아_가야 한다는 애로사항이 있습니다.

이와 같은 애로 사항 때문에 퍼포먼스를 최대로 발휘하지 못 하는 경우가 많습니다.

이에 대한 해결책으로InnoDB에는 Adaptive Hash Index 를 지원합니다.
InnoDB Adaptive Hash Index는 B-Tree의 한계를 보완할 수 있는 좋은 기능입니다.

Adaptive Hash Index ?

The adaptive hash index (AHI) lets InnoDB perform more like an in-memory database on systems with appropriate combinations of workload and ample memory for the buffer pool, without sacrificing any transactional features or reliability

Adaptive Hash Index 는 _자주 사용되는 칼럼_을 해시로 정의합니다.
B-Tree를 이용하지 않고 다이렉트로 데이터에 접근할 수 있는 기능인 것 입니다.

모든 값을 해시로 생성하는 것이 아닌, _자주 사용되는 데이터 값만 내부 알고리즘을 통해 해시 값을 생성_합니다.

장점을 얘기해봤으니 단점도 알아봅시다.

Adaptive Hash Index는 사용되는 데이터를 내부 알고리즘이 판단하여 해시 키를 생성하기 때문에 제어가 어렵습니다.

오랫동안 사용되지않은 테이블이라도 기존 해시 자료 구조가 남아있기 때문에 테이블 drop 시 영향을 줄 수 있습니다.

설정을 enable 하고자 한다면 아래 명령어를 참고하시면 됩니다.

(innodb_adaptive_hash_index 파라미터는 InnoDB Plugin 1.0.3 부터 동적으로 Global 변수를 변경 가능합니다.)

set global innodb_adaptive_hash_index = 1;

반대로 설정을 disable 하고자 한다면 아래 명령어를 참고하면 됩니다.

set global innodb_adaptive_hash_index = 0;

설정 값을 보고자 한다면 아래의 명령어를 참고하면 됩니다.

show variables like '%adaptive%';# 아래 정보는 저의 환경에서 실행한 결과 값 입니다.'innodb_adaptive_flushing', 'ON''innodb_adaptive_flushing_lwm', '10''innodb_adaptive_hash_index', 'ON''innodb_adaptive_max_sleep_delay', '150000'

통계 정보는 아래 명령어를 통해 참고 할 수 있습니다.

show global status like 'Innodb_adaptive_hash%';

Reference

About Me

Related Posts

What do you think?