인덱스란 데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조이다.
인덱스는 테이블의 컬럼값에 대한 정렬된 데이터 구조체로, 특정 컬럼에서 원하는 값을 빠르게 찾을 수 있도록 도와준다. 인덱스를 사용하면 데이터베이스가 검색 시에 전체 데이터를 스캔하는 것이 아니라, 인덱스를 이용하여 빠르게 검색할 수 있다.
인덱스를 사용한다면 테이블을 검색하는 속도와 성능이 향상된다. 따라서 시스템의 낮은 응답시간을 보일 수 있다. (시스템 부하를 줄일 수 있다.) 예를 들어, 대규모의 테이블에서 특정 이름을 가진 사용자를 검색해야 하는 경우 인덱스가 있다면 해당 컬럼에서 이름을 매우 빠르게 찾아낼 수 있지만 인덱스를 사용하지 않는다면 테이블 전체를 스캔해야 하기 때문에 (Full Scan) 시간이 매우 오래 걸린다.
다음은 인덱스 사용 모습을 쿼리를 통해 설명하는 것이다.
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100)
);
다음과 같은 사용자 테이블이 있고 'name' 컬럼을 인덱스로 생성한다고 가정한다.
CREATE INDEX idx_users_name ON users (name); -- 인덱스 생성
그리고 where절에 'name' 컬럼을 기준으로 하여 검색 SQL문을 작성한다.
SELECT * FROM users WHERE name = 'John';
'name' 컬럼으로 인덱스를 생성하였으므로, 데이터베이스는 인덱스를 이용하여 name이 'John'인 데이터를 빠르게 찾아낼 수 있다.
다음과 같은 경우의 테이블일 경우 대체로 인덱스 사용이 효과를 발휘할 수 있다.
B+Tree는 B-Tree의 단점을 개선하였다. 리프 노드(leaf node)를 제외한 모든 노드가 다수의 자식을 가지는 다진 트리(multyway tree) 자료구조이다. 대용량 데이터를 쉽게 저장하고 검색할 수 있는 효율적인 자료구조로 주로 데이터베이스 시스템에서 인덱스로 많이 사용된다. B+Tree는 B-Tree와 비슷한 방식으로 데이터를 정렬된 상태로 저장하며, 리프 노드에만 데이터를 저장한다. 또한, 인덱스를 구성하는 모든 리프 노드는 하나의 연결 리스트(linked list)로 연결되어 있다. 이러한 구조는 범위 검색(range search)을 효율적으로 수행할 수 있도록 한다.
B+Tree의 장점은 다음과 같다.
- B-Tree와 마찬가지로 모든 노드의 균형을 유지하여 검색 속도를 빠르게 유지한다.
- 리프 노드에만 데이터를 저장하므로, 블록 단위로 데이터를 읽어오는 디스크 I/O를 효율적으로 수행할 수 있다.
- 범위 검색이나 정렬과 같은 작업을 수행하는 데 매우 효율적이다.
해시 테이블은 데이터를 key-value 쌍으로 저장하는 자료구조이다. 데이터의 키(key)를 해싱 알고리즘을 이용하여 해시 값(hash value)으로 변환한 후, 해당 해시 값을 가진 버킷(bucket)에 데이터를 저장한다. 검색 속도는 해시 값으로 바로 해당 버킷을 찾아 데이터를 검색할 수 있기 때문에 매우 빠르다. 데이터가 무작위로 저장될 가능성이 있어, 검색 속도가 일정하지 않을 수 있으며, 범위 검색이나 정렬과 같은 작업을 수행하는데는 적합하지 않다. 따라서 해시 테이블은 대부분의 데이터베이스에서는 드물게 사용된다.