데이터베이스 성능 개선하기 - Index

지수 🤓·2020년 5월 19일
0

개념 정리

목록 보기
11/17
post-thumbnail
post-custom-banner

DB의 처리 능력은 트랜잭션 수 / 시간으로 계산할 수 있다.

DB의 성능 이슈는 디스크 I/O를 어떻게 줄이느냐에서 시작된다. 즉 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다.

인덱스, 쿼리 튜닝 등을 통해 성능을 개선할 수 있다.

Index

인덱스는 어떤 데이터가 어디에 있다는 위치 정보를 가지는 주소록 같은 개념이다.

인덱스가 있으면 모든 블록을 다 읽기 않고 원하는 데이터가 있는 블록 주소를 찾아내서 그 블록만 메모리로 복사해오면 되기 때문에 작업을 빨리 끝낼 수 있다.

읽기 성능을 향사시키기 위한 자료구조라고 할 수 있고 B+-Tree, Hash 두 가지가 있다.

B-Tree Index

실시간으로 데이터가 입력되고 수정되는 환경에서 사용된다. 값의 종류가 많고 중복되는 값이 적은 경우 사용하면 좋다. 일반적으로 사용된다.

컬럼의 값을 변경하지 않고 값의 앞 부분만 잘라서 관리하여 인덱싱하는 알고리즘이다. 인덱스 테이블을 따로 관리하며 인덱스 구조체 내에서는 항상 정렬된 상태를 유지하고 있다.

구조

트리 구조로 최상위에 루트노드가 존재하고 자식 노드가 붙어있는 모양이다. 가장 하위에 있는 노드를 리프 노드라 하고, 중간 노드를 브랜치 노드라고 한다.

인덱스의 리프노드는 항상 실제 데이터 레코드를 찾아가기 위한 주소 값을 가지고 있다.

출처

Hash Index

칼럼의 값으로 해시 값을 게산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다.
동등 비교 검색에는 최적화돼 있지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 등 값의 일부로만 검색하고자 할 때는 사용할 수 없다. 범위를 검색하거나 정렬된 결과를 가지고 오는 것도 마찬가지이다.

메모리 기반의 테이블에 주로 구현돼 있으며 디스크 기반에서는 거의 사용하지 않는다.

해시 인덱스의 큰 장점은 실제 키 값과는 관계없이 인덱스 크기가 작고 검색이 빠르다는 것이다. 트리 구조가 아니므로 검색하고자 하는 값을 주면 해시 함수를 거쳐 찾고자 하는 키값이 포함된 버킷을 알아낼 수 있다.

버킷은 해시 값(인덱스)과 실제 값의 주소를 연결해 놓은 저장 공간

출처

주의사항

insert 하는 경우 index에 대한 데이터도 추가해줘야 하므로 성능 손실이 생긴다.

delete의 경우 Index값은 삭제하지 않고 사용 안한다는 표시만 한다. 즉 row의 수는 그대로라서 실제 데이터와 index데이터의 개수가 다를 수 있다.

profile
Backend Junior Developer
post-custom-banner

0개의 댓글