데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 도구
테이블의 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다. (물리적 주소와 컬럼의 값 - key, value의 한 쌍)
장점: 테이블 검색 속도 및 성능 향상 ⇒ 시스템 전반적인 부하 감소
인덱스에 의해 데이터들은 정렬된 형태를 갖는다. Where문으로 특정 조건의 데이터를 찾기 위해서 테이블의 전체를 조건과 비교해야 하는 풀 스캔 작업과 비교해서, 인덱스는 데이터들이 정렬되어 있기 때문에 조건에 맞는 데이터를 빠르게 찾을 수 있다.
⇒ ORDER BY, MIN/MAX 역시도 이미 정렬되어 있기 때문에 빠르게 수행 가능
단점
인덱스를 항상 정렬된 상태로 유지해야 하기 때문에 인덱스가 적용된 컬럼에 삽입, 삭제, 수정 작업을 수행하면 추가 작업이 필요하다. (인덱스의 추가도 추가적으로 필요)
인덱스의 수정이 필요할 때는 기존의 인덱스를 사용하지 않는다는 작업을 수행하고 새로운 인덱스를 추가함.
⇒ 수정 작업이 많은 경우 실제 데이터에 비해 인덱스가 과도하게 커지는 문제점 발생 (추가 저장 공간 많이 필요)
전체 데이터의 10~15% 이상의 데이터를 처리하거나, 데이터의 형식에 따라 성능 낮아질 수 있음. (나이나 성별 같이 값의 범위가 적은 컬럼의 경우, 인덱스를 읽고 나서 다시 많은 데이터를 조회해야 하기 때문에 비효율적이다.)
인덱스를 사용하면 좋은 경우
데이터의 범위가 넓고 중복이 적고 조회가 많거나 정렬된 상태가 유용한 컬럼에 사용하는 것이 좋다.
Clustered Index : MySQL이 자동으로 설정하는 Index
위 세 가지 경우의 공통점은 ?
⇒ count(*)와 distinct key한 값이 동일하다는 것.
⇒ 그 이유는 모든 row를 통틀어 중복이 적으면 적을수록 Index는 높은 효율을 자랑한다.
Non Clustered Index : 개발자가 설정하는 모든 Index
멀티 컬럼 Index의 경우 최대 16개의 컬럼을 사용할 수 있고, 테이블 당 인덱스의 개수는 최대 64개까지 지정이 가능 (Clustered Index까지 65개)
⇒ 멀티 컬럼 인덱스는 단일 컬럼 인덱스보다 비효율적이기 때문에 사용에 신중해야 한다.
Index를 설정했지만 Full scan으로 동작하는 경우
자료구조
(key, value)로 쌍을 표현하며, key값을 이용해 대응되는 value값을 구하는 방식.
해시 충돌이라는 변수를 제외하면 O(1)의 매우 빠른 시간만에 데이터를 탐색할 수 있다.
그렇지만, Index에서 해시 테이블은 사용되지 않음. why ?
⇒ 해시 테이블은 등호 연산에 최적화되어 있다. 데이터베이스에서는 부등호 연산이 자주 사용되기 때문에.
모든 leaf node가 같은 level로 유지되도록 밸런스를 맞춘다.
자식 node의 개수가 2개 이상이며, node 내의 key가 1개 이상일 수 있다.
node의 key 수가 k개라면, 자식 node의 수는 k+1개
node의 key는 반드시 정렬된 상태
자식 node들의 key는 현재 node의 key를 기준으로 크기 순으로 나뉘게 됨.
root node는 항상 2개 이상의 자식 node를 가짐 (root node = leaf node 제외)
노랑 : 자식 node를 가리키는 포인터
숫자 담긴 네모 : key
숫자 : data(value)
B-Tree의 탐색
B-Tree의 삽입
B-Tree의 삭제
leaf node끼리는 Linked list로 연결되어있다.
B- Tree는 어느 한 데이터 탐색은 효율적이지만, 모든 데이터 순회에는 모든 노드를 방문해야하므로 단점을 개선
leaf node를 제외하고 데이터를 저장하지 않기 때문에 메모리 확보, 하나의 node에 더 많은 포인터를 가질 수 있기 때문에 트리의 높이가 낮아짐, 검색 효율
풀스캔의 경우 B+Tree는 leaf node에만 데이터가 저장되고 연결리스트로 연결되어 있기 때문에 선형 시간 소모, B-Tree는 모든 노드 확인
반면, B- Tree는 최상의 경우 특정 Key를 root node에서 찾을 수 있지만, B+Tree의 경우 반드시 leaf node까지 가야함.
B+ Tree의 삽입
B+ Tree의 삭제
B+ Tree의 수정