1. 인덱스의 개요
1. 인덱스의 개념 및 문제점
우리가 전공서를 보다 보면 뒤에 인덱스라고 단어가 굉장히 많이 나와있는 것을 볼 수 있다. 우리가 어떤 단어가 무슨 페이지에 있는지 알기 위해 인덱스를 주로 사용하는데, 데이터베이스에서 인덱스도 이와 같은 내용이다. 한마디로 인덱스는 '데이터를 좀 더 빨리 찾을 수 있는 도구'라고 볼 수 있다. 이 말은 즉, 검색 속도가 빨라진다는 것이다.
하지만, 인덱스에도 단점이 있다. 우리가 전공서에 모든 단어를 뒤에 인덱스에 집어넣게 된다면 책의 분량이 엄청나게 많아진다. 완전 극단적으로 생각하자면, 인덱스가 더 많아지면 본문보다 인덱스가 더 많아진다는 이상한 상황이 될 수 있다는 것이다. 이는 즉, 쓸데없이 차지하는 공간만 늘어나고 쓰지를 않는다는 것이다. 이렇게 된다면 오히려 검색 속도가 더 느려지는 상황이 발생할 수 있다는 것이다. MySQL에서도 마찬가지이다. 데이터베이스의 총 분량이 많아지면, 차지하는 공간만 늘어나고 오히려 속도가 느려지는 현상이 발생한다.
2. 인덱스의 종류
1. 인덱스의 종류
- 인덱스의 종류에는 클러스터형 인덱스, 보조 인덱스가 있다.
- 클러스터형 인덱스는 책의 내용 자체가 순서대로 정렬되어 있다는 것이다. 영어 사전과 똑같다. 이는 테이블 당 하나만 생성할 수 있다. 아마, 기본키에 인덱스가 생기지 않을까 거의 확신할 수 있다.
- 보조 인덱스는 찾아보기에서 먼저 단어를 찾은 후 그 옆에 표시된 페이지로 이동하여 결과값을 찾는 것과 똑같다. 이는 여러 개를 생성할 수 있다.
2. 클러스터형 인덱스
- 기본키를 설정하면 자동으로 해당 열(아이디)에 클러스터형 인덱스가 생성된다.
- 인덱스 상태 확인하는 SQL문
SHOW INDEX FROM 테이블_이름;
- 클러스터형 인덱스가 생성이 되면 기본키는 알아서 정렬이 된다.
<클러스터형 인덱스 정리>
1) PRIMARY KEY로 지정한 열에 클러스터형 인덱스가 생성
2) UNIQUE NOT NULL로 지정한 열에 클러스터형 인덱스가 생성
3) UNIQUE 또는 UNIQUE NULL로 지정한 열에 보조 인덱스가 생성
4) 우선순위는 PRIMARY KEY가 우선 -> 오름차순 정렬
3. B-TREE
1. B-Tree의 개요
- 흔히 자료 구조에 나오는 트리와 비슷한 형태, 데이터 구조로 균형이 잡혀있다.
- MySQL에서는 노드를 페이지라고 하며, 자료 구조에 나오는 노드랑 똑같은 역할이다.
2. B-Tree의 특성
- 이진 트리가 자식 노드가 최대 2개인 노드를 말하는 것이라면 B-Tree는 자식 노드의 개수가 2개 이상인 트리
- 노드 내의 데이터가 1개 이상
- 노드의 데이터 수가 N개라면 N+1개의 자식 노드를 가리키는 포인터로 구성됨
- 노드의 자식 노드의 데이터들은 노드 데이터를 기준으로 데이터보다 작은 값은 왼쪽, 서브 트리에 큰 값들은 오른쪽 서브 트리에 이뤄진다.
- 루트 노드를 제외한 모든 노드는 적어도 M/2개의 데이터를 갖고 있어야 한다. (Ex. 3차 B-Tree는 최소 2개 이상)
3. 클러스터형 인덱스와 보조 인덱스
1) 클러스터형 인덱스의 특징
- 인덱스를 생성할 때 데이터 페이지 전체가 다시 정렬된다. 대용량 데이터에서는 심각한 부하를 줄 수 있다.
- 리프 페이지가 곧 데이터 페이지이다.
- 보조 인덱스보다 검색 속도가 빠르고 데이터 변경 속도는 느리다.
2) 보조 인덱스의 특징
- 인덱스를 생성할 때 데이터 페이지는 그대로 둔 상태에서 별도의 페이지에 인덱스 구성
- 리프 페이지에 데이터가 아니라 RID (주소 값)이 들어 있다.
- 데이터 변경 시 클러스터형 인덱스보다 성능 부하가 적다.
- 보조 인덱스는 한 테이블에 여러 개를 생성할 수 있다. 남용하면 성능을 오히려 떨어뜨리는 결과를 초래할 수 있다.
4. 인덱스 생성
1. 인덱스 생성 방법
CREATE INDEX 인덱스_이름
ON 테이블_이름(속성_이름);
2. 인덱스 삭제 방법
DROP INDEX index_name ON table_name;
5. 인덱스의 생성 기준
1) 인덱스는 열 단위에서 생성된다.
2) 인덱스는 WHERE 절에서 사용되는 열에서 생성되다.
3) WHERE 절에 사용되는 열이라도 자주 사용해야 가치가 있다.
4) 데이터 중복도가 높은 열에는 인덱스를 만들어도 효과가 없다.
5) 외래키를 설정한 열에는 자동으로 외래키 인덱스가 생성된다.
6) 조인에 자주 사용되는 열에는 인덱스를 생성하는 것이 좋다.
7) 데이터 변경이 얼마나 자주 일어나는지 고려해야 한다.
8) 클러스터형 인덱스가 아예 없는 것이 좋은 경우도 있다.
9) 사용하지 않은 인덱스는 제거한다.
끝!
'CS 전공 > DB' 카테고리의 다른 글
[데이터베이스] 11. 보안과 권한 관리 (0) | 2024.06.10 |
---|---|
[데이터베이스] 9. SQL (0) | 2024.06.08 |
[데이터베이스] 8. 관계 데이터 연산 (0) | 2024.06.02 |
[데이터베이스] 7. 정규화 (0) | 2024.04.24 |
[데이터베이스] 6. 데이터베이스 설계 (0) | 2024.04.24 |