데이터베이스 테이블에 저장된 데이터의 검색 속도를 향상시키기 위한 자료구조
특정 컬럼에 인덱스를 생성(CREATE)하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다.
이렇게 인덱스가 생성하였다면 앞으로 쿼리문에 "인덱스 생성 컬럼을 Where 조건으로 거는 등"의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 탈 수가 있다.
만약 인덱스를 타게 되면 아래의 그림과 같이 인덱스를 타게 되고 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작을 하여 검색 속도의 향상을 가져올 수 있다.
검색 대상 레코드의 범위를 줄여 검색 속도를 빠르게 할 수 있다.
중복 데이터를 방지하거나 특정 컬럼의 유일성(Unique)을 보장할 수 있다.
ORDER BY 절과 GROUP BY 절, WHERE 절 사용시 효율적인 처리가 가능하다.
정렬 order by : 인덱스를 사용하면 ****order by 에 의한 sort 과정을 피할 수 있다. 본래 order by는 괴장히 부하가 많이 걸리는 작업이기 때문에 인덱스를 통해 이미 정렬되어 있으면 부하가 걸리지 않을 수 있다.
조건 검색 where 절 : 보통 where절의 사용할 때 특정 조건에 맞는 데이터를 찾기 위해 데이터를 처음부터 끝까지 다 비교해야 하는데, 인덱스를 통해 데이터가 정렬되어 있으면 빠르게 찾아낼 수 있다.
MIN, MAX의 효율적인 처리가 가능하다.
인덱스를 통해 데이터가 정렬되어 있기 때문에 처음부터 끝까지 뒤져서 찾는 것이 아닌 인덱스로 정렬된 데이터에서 MIN, MAX를 효율적으로 추출할 수 있다.
인덱스 생성에 따른 관리를 위해 약 10%에 해당하는 추가적인 저장 공간이 필요하다.
(인덱스 사용 시 해당 정보를 담은 MYI 파일 생성)
때문에 너무 많이 인덱스를 생성하면 하나의 쿼리문을 빠르게 만들 수 있지만 대신에 전체적인 데이터베이스의 성능 부하를 추래한다. 무조건적인 인덱스 생성보다 SQL문을 효율적으로 짜고, 인덱스 생성은 마지막 수단으로 사용해야한다.
INSERT(삽입), DELETE(삭제), UPDATE(수정) 작업 시에도 인덱스를 업데이트해야 하므로 성능 저하가 발생할 수 있다. (계속 정렬해주어야 하기 때문)
그래서 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 더 좋다.
한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
인덱스 생성 시간이 오래 걸릴 수 있다.
인덱스는 항상 최신 데이터를 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
따라서 인덱스가 적용된 원본 테이블 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 인덱스에도 다음과 같은 연산을 추가적으로 해주어야 하며, 그에 따른 오버헤드가 발생한다. 안쓰는 인덱스는 삭제시키는것이 좋다.
생성된 인덱스는 트리구조를 가진다. 삽입,수정,삭제등이 오랫동안 일어나다보면 트리의 한쪽이 무거워져 전체적으로 트리의 깊이가 깊어진다. 이러한 현상으로 인해 인덱스의 검색속도가 떨어지므로 주기적으로 리빌딩하는 작업을 거치는것이 좋다.
🔗 참조 링크 : https://coding-factory.tistory.com/746