인덱스 란
데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조 이다.
1000 페이지가 있는 책 안에 원하는 제목, 내용, 단어를 찾기 위해서는 어떻게 해야할까?
하나하나 다 찾아보면 정말 오랜시간이 걸릴 것이다..
그렇기 때문에 보통 책의 맨 앞장을 보면 목차, 카테고리 같은 것이 있다. 이것을 통하여
좀 더 쉽게 찾을 수 있다. 이 목차, 카테고리가 인덱스라고 생각하면 된다.
인덱스를 활용하게 되면 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다.
// YeDam 이라는 이름을 업데이트 해주기 위해서는 Dam 조회해야 한다.
UPDATE USER SET NAME = 'YeDam' WHERE NAME = 'Dam';
인덱스는 보통 Where
와 같은 조건을 사용하기 때문에 빠른 검색이 가능하다.
반대로 말하자면 인덱스를 사용하지 않는 컬럼을 조회해야한다면 전체를 탐색해야하기때문에 처리 속도가 떨어진다.
인덱스의 관리
- 인덱스는 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
- 그렇기에 인덱스가 적용된 컬럼에
INSERT, UPDATE, DELETE
가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.
- INSERT: 새로운 데이터에 대한 인덱스를 추가함
- DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
- UPDATE: 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
인덱스의 장단점
- 장점
1) 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
2) 전반적인 시스템의 부하를 줄일 수 있다.- 단점
1) 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
2) 인덱스를 관리하기 위해 추가 작업이 필요하다.
3) 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
⭐️
만약 CREATE, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생할 수 있다. 그러한 이유 중 하나는 DELETE와 UPDATE 연산 때문이다. 앞에서 설명한대로, UPDATE와 DELETE는 기존의 인덱스를 삭제하지 않고 '사용하지 않음' 처리를 해준다고 하였다. 만약 어떤 테이블에 UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터는 10만건이지만 인덱스는 100만 건이 넘어가게 되어, SQL문 처리 시 비대해진 인덱스에 의해 오히려 성능이 떨어지게 될 것이다.
인덱스를 사용하면 좋은 경우
- 규모가 작지 않은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼