CS/데이터베이스
인덱스
바디스
2023. 2. 26. 23:12
인덱스란?
인덱스는 데이터를 빠르게 검색할 수 있게 해주는 객체 입니다.
컬럼을 오름차순 혹은 내림차순으로 정렬한 후 빠르게 찾을 수 있도록 도와줍니다.
인덱스 구조
Index는 논리적/물리적으로 테이블과 독립적입니다.
테이블은 컬럼에 데이터가 정렬되지 않고 입력된 순서대로 들어가지만, Index는 KEY 컬럼과 ROWID 컬럼 두개로 이루어져 있고 오름차순, 내림차순으로 정렬이 됩니다.
Key : 인덱스를 생성하라고 지정한 컬럼의 값
MySQL에서 테이블 생성 시, 아래와 같은 3가지 파일이 생성됩니다.
FRM : 테이블 구조 저장 파일
MYD : 실제 데이터 파일
MYI : Index 정보 파일 (Index 사용 시 생성)
- 사용자가 쿼리를 통해 Index를 사용하는 칼럼을 검색하게 되면, 이때 MYI 파일의 내용을 활용합니다.
- 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작습니다.
(보통 인덱스는 KEY-ROWID만 가지고 있고, 테이블의 세부항목들은 갖고 있지 않기 때문)
장점
- 검색 속도 향상
- 시스템의 부하를 줄여, 시스템 전체 성능향상에 기여가 가능합니다.
단점
- 인덱스를 위한 추가 공간이 필요합니다.
- 생성에 시간이 소요 될 수 있습니다.
- 추가, 수정, 삭제에 대한 성능이 하락할 수 있습니다.
주의사항
- 무분별한 인덱스는 용량을 차지하고, 옵티마이저의 최적화를 낮추는 결과를 얻게 됩니다.
- 특정 컬림들을 조건으로 걸 때, 정렬된 인덱스의 순서와 맞지않는다면 추가적인 비용이 발생합니다.
Index 생성 가이드
항목 | 설명 |
대상 테이블 | - 데이터 양이 많고 증가량이 큰 테이블 |
대상 컬럼 | - WHERE절에서 상수 조건으로 빈번하게 사용되는 컬럼 - PK 및 FK - 테이블 조인에 사용되는 컬럼 - 선택성이 높은 컬럼은 단독적으로 생성하여 활용도를 향상시킬 수 있음 - 자주 같이 사용되는 조건 컬럼을 결함하여 결합 인덱스 생성(컬럼 순서 유의) - 가능한 수정이 빈번하지 않는 컬럼 |
고려사항 | - 최소의 인덱스로 최대의 효과를 나타낼 수 있도록 액세스 패턴을 분석하여 생성 - 컬럼의 분포도가 10~15% 이내인 경우 B*트리 인덱스로 - 넓은 범위를 인덱스로 처리 시 부하를 가중시켜 성능을 감소시킬 수 있음 - 새로 추가된 인덱스는 기존 액세스 경로에 영향을 미칠 수 있음 |
Mysql Index 종류
- Clusted Index(클러스터형 인덱스)
- Non-Clusted Index(비클러스터형 인덱스)
Clusted Index(클러스터형 인덱스)
- 테이블당 1개씩만 허용됩니다.
- 물리적으로 행을 재배열 합니다.
- PK설정 시 그 칼럼은 자동으로 클러스터드 인덱스가 만들어집니다.
- 인덱스 자체의 리프 페이지가 곧 데이터로 테이블 자체가 인덱스입니다. (따로 인덱스 페이지를 만들지 않는다.)
- 데이터 입력, 수정, 삭제 시 항상 정렬 상태를 유지합니다.
- 비 클러스형 인덱스보다 검색 속도는 더 빠르지만 데이터의 입력. 수정, 삭제는 느립니다.
Non-Clusted Index(비클러스터형 인덱스)
- 테이블당 약 240개의 인덱스를 만들 수 있습니다.
- 인덱스 페이지는 로그파일에 저장됩니다.
- 레코드의 원본은 정렬되지 않고, 인덱스 페이지만 정렬됩니다.
- 인덱스 자체의 리프 페이지는 데이터가 아니라 데이터가 위치하는 포인터(RID)이기 때문에 클러스터형보다 검색 속도는 더 느리지만 데이터의 입력, 수정, 삭제는 더 빠릅니다.
- 인덱스를 생성할 때 데이터 페이지는 그냥 둔 상태에서 별도의 인덱스 페이지를 따로 만들기 때문에 용량을 더 차지합니다.
기준 | 클러스터 인덱스 | 비 클러스터 인덱스 |
속도 | 빠르다 | 느리다 |
사용메모리 | 적다 | 많다 |
인덱스 | 인덱스가 주요 데이터 | 인덱스가 데이터의 사본(Copy) |
개수 | 한 테이블에 한개 | 한 테이블에 여러개 |
리프 노드 | 리프 노드 자체가 데이터 | 리프 노드는 데이터가 저장되는 위치 |
저장값 | 데이터를 저장한 블록의 포인터 | 값과 데이터의 위치를 가리키는 포인터 |
정렬 | 인덱스 순서와 물리적 순서가 일치 | 인덱스 순서와 물리적 순서가 불일치 |
인덱스 구조
인덱스의 자료구조는 해시 테이블, B-Tree 등 다양하게 있었지만 현재에는 주로 B+Tree 가 사용됩니다.
B+Tree
기존의 B-Tree는 어느 한 데이터의 검색은 효율적이지만, 모든 데이터를 한 번 순회하는 데에는 트리의 모든 노드를 방문해야 하므로 비효율적입니다. 이러한 B-Tree의 단점을 개선시킨 자료구조가 B+Tree입니다.
- B-Tree의 경우, internal 또는 branch 노드에 key와 data를 담습니다. 하지만, B+Tree의 경우 브랜치 노드에 key만 담아두고, data는 담지않습니다. 오직 리프 노드에만 key와 data를 저장합니다. (B+Tree는 key값이 중복 될 수 있다.)
- 모든 리프 노드는 연결리스트로 연결 되어있습니다.
B+Tree의 장점
- 리프 노드에만 데이터를 담아두기에 메모리를 적게 사용함으로써 많은 key들을 수용 할 수 있습니다.
(하나의 노드에 더 많은 key를 담을 수 있기에 트리의 높이가 더 낮아진다.) - 풀 스캔시, 리프 노드가 연결 되어있으므로 한 번의 탐색만 하면 되기에 B-Tree보다 빠르다.