- 데이터베이스에서 인덱스는 데이터 검색 속도를 향상시키는 자료구조입니다. 인덱스는 일반적으로 B-Tree (바이너리 트리의 확장형)와 같은 자료구조를 사용하여 데이터를 저장하며, 이를 통해 특정 데이터를 빠르게 검색할 수 있습니다.
- 인덱스의 원리를 책의 색인에 비유해 설명할 수 있습니다. 책의 내용을 찾고 싶을 때, 모든 페이지를 일일이 훑어보는 것은 매우 비효율적입니다. 대신 색인을 확인하면 해당 키워드가 어느 페이지에 있는지 쉽게 찾을 수 있습니다.
- 데이터베이스에서도 이와 비슷하게 작동합니다. 인덱스를 사용하지 않는 테이블에서 데이터를 찾으려면 전체 테이블을 스캔해야 하지만, 인덱스를 사용하면 특정 데이터를 빠르게 찾을 수 있습니다.
- 그러나 인덱스는 무조건적으로 좋은 것만은 아닙니다. 인덱스를 생성하면 디스크 공간을 추가로 사용하며, 데이터를 삽입하거나 업데이트할 때 인덱스도 함께 업데이트해야 하므로 쓰기 작업이 느려질 수 있습니다. 따라서, 어떤 칼럼에 인덱스를 생성할지는 신중하게 결정해야 합니다.
- 일반적으로 데이터 검색이 자주 발생하고, 데이터의 중복도가 낮은 칼럼에 인덱스를 생성하는 것이 좋습니다. 이렇게 하면 인덱스를 통해 데이터를 빠르게 검색할 수 있고, 동시에 쓰기 성능 저하를 최소화할 수 있습니다.
**B-Tree는 Balanced Tree의 약자로, 모든 노드가 정해진 범위의 자식을 가지는 트리 구조입니다. 이러한 구조는 데이터베이스 시스템과 파일 시스템에서 인덱스를 구현하는 데 자주 사용됩니다.
B-Tree와 Binary Tree (이진 트리)는 이름이 비슷하여 혼동하기 쉽지만, 두 구조는 상당히 다릅니다.
Binary Tree에서 각 노드는 최대 두 개의 자식 노드를 가질 수 있습니다. 반면에 B-Tree에서 노드는 두 개 이상의 자식 노드를 가질 수 있습니다.
B-Tree는 균형이 잘 잡혀 있기 때문에, 데이터베이스에서 큰 양의 데이터를 빠르게 검색할 수 있습니다. B-Tree는 트리의 깊이를 최소화하므로, 특정 데이터를 찾기 위해 필요한 디스크 접근 횟수를 줄일 수 있습니다.
또한, B-Tree는 데이터 삽입과 삭제에 대한 오버헤드가 적습니다. B-Tree는 삽입과 삭제 시에도 트리의 균형을 유지하기 때문에, 인덱스의 성능을 일정하게 유지할 수 있습니다.
이러한 이유로, 대부분의 데이터베이스 시스템은 인덱스를 구현할 때 B-Tree를 사용합니다.
B-Tree라는 개념을 가장 단순하게 이해하려면, 이를 "다중 분기"가 가능한 트리라고 생각하면 좋습니다. 일반적인 이진 트리(Binary Tree)는 각 노드가 최대 두 개의 자식 노드를 가지지만, B-Tree는 각 노드가 두 개 이상의 자식 노드를 가질 수 있습니다.
이를 평범한 책으로 비유해보겠습니다. 책의 목차를 상상해보세요. 첫 번째 장, 두 번째 장, 세 번째 장 등등으로 갈 수 있죠. 이를 이진 트리로 생각하면, 책의 각 장이 하나의 노드이고, 각 장이 두 개의 '자식' 섹션을 가지는 것이죠.
그런데 우리가 읽는 대부분의 책의 장은 보통 두 개 이상의 섹션을 가지고 있습니다. 이것이 바로 B-Tree의 개념입니다. 각 '노드' (또는 책의 장)는 두 개 이상의 '자식'을 가질 수 있습니다. 이런 식으로 B-Tree는 데이터를 훨씬 더 효과적으로 조직화하고 관리할 수 있습니다.
이와 같이 B-Tree는 이진 트리를 확장한 형태로, 데이터베이스와 같이 대량의 데이터를 효율적으로 관리하고 검색할 수 있게 해줍니다.
인덱스란 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조입니다. 데이터 블록이 10만개 있다고 가정할 때 SELECT문 실행시 server process가 구문 분석 과정을 마친 후 database buffer cache 에 조건이 부합하는 데이터가 있는지 확인, 해당 정보가 buffer cache에 없다면 디스크 파일에서 조건에 부합하는 블럭을 찾아서 database buffer cache에 가져온 뒤 사용자에게 보여줌, 이 때 인덱스가 없으면 10만개를 전부 database buffer cache 로 복사한 후 풀스캔으로 찾게 되는데 index가 있으면 where절의 조건의 컬럼이 index의 키로 생성되어있는지 확인한 뒤, 인덱스에 먼저 가서 조건에 부합하는 정보가 어떤 ROWID를 가지고 있는지 확인 후 ROWID에 있는 블럭을 찾아가 해당 블럭만 buffer cache에 복사합니다.
** 데이터베이스 버퍼 캐시(Database Buffer Cache)는 주 메모리 내의 공간으로, 데이터베이스에서 가장 자주 접근하는 데이터와 인덱스를 저장합니다. 이로 인해 디스크 I/O 작업이 줄어들며, 데이터베이스의 성능이 향상됩니다. 쿼리 실행 시, 먼저 데이터베이스 버퍼 캐시에서 필요한 데이터를 찾고, 해당 데이터가 캐시에 없는 경우에만 디스크에서 데이터를 읽어오게 됩니다.
** ROWID는 데이터베이스 테이블의 각 행을 고유하게 식별하는 값입니다. 이는 일반적으로 시스템에서 자동으로 생성되며, 사용자가 직접 변경할 수 없습니다. ROWID는 특정 행의 물리적 위치를 나타내므로, 인덱스를 통해 ROWID를 얻은 후 해당 ROWID를 사용하여 데이터를 빠르게 접근할 수 있습니다
인덱스를 사용하면 데이터베이스는 WHERE 절의 조건이 일치하는 레코드를 찾기 위해 전체 테이블을 스캔하지 않고, 인덱스를 통해 레코드의 위치를 빠르게 찾아낼 수 있습니다. 이렇게 하면 쿼리의 성능을 크게 향상시킬 수 있습니다.
그러나 인덱스는 테이블에 쓰기 작업을 수행할 때 오버헤드를 발생시킵니다. 레코드를 삽입하거나 업데이트할 때마다, 데이터베이스는 해당 인덱스도 함께 업데이트해야 합니다. 따라서 인덱스는 검색 성능이 중요한 테이블에 주로 사용되며, 쓰기 작업이 빈번한 테이블에는 신중하게 사용해야 합니다.
또한 인덱스는 디스크 공간을 사용합니다. 인덱스를 생성할 때마다, 데이터베이스는 인덱스에 필요한 디스크 공간을 할당합니다. 이는 데이터베이스의 총 용량을 증가시키므로, 인덱스를 사용할지 여부는 검색 성능, 쓰기 성능, 그리고 디스크 공간 사용량 등 여러 요소를 고려하여 결정해야 합니다.
** B-Tree 인덱스 : B-Tree 인덱스는 가장 일반적으로 사용되는 인덱스 유형입니다. B-Tree 인덱스는 모든 값을 저장하며, 각 값은 해당 데이터를 가리킵니다. B-Tree는 속성 값의 대소비교를 통해 찾고자 하는 값에 빠르게 접근할 수 있습니다. 대부분의 DBMS에서 기본 인덱스로 사용되며, 숫자 및 문자열 데이터에 효과적입니다.
B-Tree 인덱스는 균형 트리(Balanced Tree) 형태의 인덱스로, 데이터베이스에서 가장 일반적으로 사용되는 인덱스 유형입니다. B-Tree 인덱스의 각 노드는 키 값들을 정렬된 상태로 가지며, 이 키 값들을 통해 트리의 하위 노드를 찾을 수 있습니다. 따라서 특정 키 값을 찾거나 키 값의 범위를 검색하는 데에 효과적입니다.
예를 들어, B-Tree 인덱스를 사용해 학생 이름에 따른 성적 정보를 찾는다고 가정해봅시다. 학생 이름이 'Aaron'인 학생의 성적을 찾기 위해 인덱스를 검색하면, B-Tree 인덱스는 'Aaron'이라는 이름을 가진 레코드를 빠르게 찾아줍니다. 또한 'Aaron'에서 'Brian'까지의 모든 학생들의 성적을 찾기 위해서도 B-Tree 인덱스를 사용할 수 있습니다.
** Hash 인덱스 : Hash 인덱스는 키를 해시 함수를 통해 변환하고, 이 해시 값을 통해 레코드에 접근하는 인덱스 유형입니다. 해시 인덱스는 특정 키 값을 통한 직접 검색에 매우 빠르지만, 키 값의 범위를 통한 검색이나 키 값의 부분 일치로 검색하는 것은 비효율적입니다. 따라서, 해시 인덱스는 특정 키로 레코드를 직접 검색하는 경우에만 효과적입니다.
해시 인덱스는 키를 해시 함수를 통해 해시 값으로 변환하고, 이 해시 값을 통해 레코드를 찾는 인덱스입니다. 해시 인덱스는 특정 키 값을 통한 직접 검색에 매우 빠르지만, 키 값의 범위를 통한 검색이나 키 값의 부분 일치로 검색하는 것은 불가능합니다.
예를 들어, 해시 인덱스를 사용해 주문 번호에 따른 주문 정보를 찾는다고 가정해봅시다. 주문 번호가 '12345'인 주문의 정보를 찾기 위해 인덱스를 검색하면, 해시 인덱스는 '12345'라는 주문 번호를 가진 레코드를 빠르게 찾아줍니다. 그러나 '12340'에서 '12350'까지의 모든 주문들의 정보를 찾기 위해서는 해시 인덱스를 사용할 수 없습니다. 해시 인덱스는 특정 키로 레코드를 직접 검색하는 경우에만 효과적입니다.
B-Tree 인덱스는 키의 범위 검색이 필요한 경우나, 키 값의 부분 일치로 검색하는 경우에 유용하고, 해시 인덱스는 특정 키로 레코드를 빠르게 검색해야 하는 경우에 유용합니다.
Bitmap 인덱스 : Bitmap 인덱스는 특정 속성의 값이 매우 작은 경우에 사용됩니다. 이런 경우, 각 속성 값에 대한 비트 배열을 만들어 각 행이 해당 값을 가지고 있는지 아닌지를 표시합니다. Bitmap 인덱스는 간단하고 공간 효율적이며, 데이터의 특정 조합을 검색할 때 빠르다는 장점이 있습니다. 하지만 데이터 수정에는 비효율적이며, 일반적으로 속성의 유일한 값이 적고, 데이터가 자주 변경되지 않는 경우에만 사용됩니다.
Multi-column 인덱스(복합 인덱스), Full-text 인덱스(전문 검색 인덱스), Spatial 인덱스(공간 인덱스) 등 다양한 인덱스 유형이 있습니다.
'Mockterview' 카테고리의 다른 글
트리(tree)와 그래프(graph) (0) | 2023.05.23 |
---|---|
이분탐색(Binary Search)의 시간복잡도 = O(log n) (0) | 2023.05.23 |
Annotation(@) (0) | 2023.05.19 |
더티체킹 (Dirty Checking) (0) | 2023.05.19 |
JPA(Java Persistence API) (0) | 2023.05.19 |