이번 포스팅에서는 인덱스에 대해서 알아보겠습니다.
인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조 입니다.
추가적인 쓰기 작업과 저장 공간은 어떻게 이루어져 있을까요? 아래 그림에서 예시를 통해 알아보겠습니다.
오른쪽 테이블에 Data라는 컬럼에 인덱스를 생성한 것이라면,, 해당 Data라는 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 주소와 함께 저장됩니다. 즉, 컬럼의 값과 물리적 주소를 한 쌍으로 저장하는 것이죠
실무에서는 인덱스를 잘 설정하는 것이 매우매우 중요합니다! 실무에서는 정말 복잡한 수백개, 수천개 이상의 SP(Stored Procedure)를 사용하는데.. Index를 설정하지 않아 SP 처리속도가 느리게 된다면.. 시스템의 성능이 비효율적이게 됩니다.
인덱스에 대해 더 쉽게 알아보겠습니다.
인덱스는 책에서 목차 혹은 색인입니다!
데이터 = 책의 내용, 인덱스 = 책의 목차, 물리적 주소 = 책의 페이지 번호인 것이죠.
인덱스를 사용한다면? -> 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상됩니다.
왜냐하면,, UPDATE나 DELETE 연산을 수행한다면 해당 대상을 조회해야만 작업을 할 수 있기 때문이다.
인덱스를 사용하지 않는다면? -> 풀 스캔을 수행해야 하고 풀 스캔은 전체를 비교하여 탐색하기 때문에
처리속도가 떨어집니다.
DBMS는 Index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있습니다.
그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을
추가적으로 해주어야 하며 그에 따른 오버헤드가 발생합니다!
INSERT라면 새로운 데이터에 대한 인덱스를 추가해야함
DELETE라면 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행한다. -> 사용하지 않음처리이다, 삭제가아닌
UPDATE라면 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가.
정리하자면...!
<인덱스의 장점>
1. 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다는 점.
2. 전반적인 시스템의 부하를 줄일 수 있음
<인덱스의 단점>
1. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요함.
2. 인덱스를 관리하기 위해 추가 작업이 필요하다.
3. 인덱스를 잘못 사용할경우 오히려 성능이 저하된다. (CREATE, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸면
인덱스의 크기가 비대해진다, 기존의 인덱스를 삭제하지 않고 사용하지 않음 처리를 하기 때문에! 예를 들어 어떤 테이블에 UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터가 10만건인데 인덱스는 100만건이 넘어가게 되어 오히러 성능이 저하된다.)
그렇다면, 인덱스를 사용하면 좋은 경우는 어떤 경우일까요?
- 규모가 작지 않은 테이블(규모가 크면 클 수록 대체로 추가적인 공간을 사용해 정렬해 놓는 게 효율적이기 때문에)
- INSERT, UPDATE, DELETE가 자주 발생되지 않는 컬럼(해당 명령어가 자주 사용된다면 인덱스를 관리하는데 작업이 많이 들어가기 때문에[인덱스를 추가하거나, 사용하지 않음 처리하기 때문에..])
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼(인덱스를 사용한다면 해당 컬럼이 정렬되어 있고 쉽게 찾을 수 있어 JOIN, WHERE, ORDER BY에 효율적이기 때문에)
- 데이터의 중복도가 낮은 컬럼(카디널리티가 높은 컬럼) (인덱스를 걸때 내가 원하는 데이터를 선택하는 과정에서 최대한 많은 데이터가 걸려져야 성능이 좋으므로, 선택하는 데이터가 많아질수록 full scan에 가까워지기 때문에! 카디널리티가 높은 컬럼을 우선순위로 두는 것이 인덱싱 전략에 유리한 것이다.)
그렇다면! 실제로 인덱스를 걸고 안걸고의 차이가 얼마만큼 나는지 간단히 알아보겠습니다!
MSSQL 기준으로, 정말 많은 데이터가 있는 테이블에 인덱스를 건 컬럼에는 0초가 나오지만
인덱스를 걸지 않은 컬럼에는 36초가 넘어가도 쿼리가 실행중인 것을 확인할 수 있습니다!
학부생 때는 DBMS에서 일반적으로 PK에 인덱스가 자동적으로 걸리기 때문에 크게 중요하게 생각하지 않았고, 데이터가 굉장히 적게 있어서 성능의 차이를 느끼지 못했지만.. 실제로 수많은 데이터를 관리하는 현업에서 Index가 pk말고도 정말 여러개의 단일컬럼, 2개 이상의 컬럼에 걸려있는 것을 보고 직접 쿼리를 날려보며 성능의 차이를 확인해볼 수 있었습니다!
더 나아가 이러한 인덱스를 관리하는 자료구조는 해시 테이블, B+ Tree가 있고, 이는 다음 포스팅에서 알아보도록 하겠습니다!
'Dev > Database' 카테고리의 다른 글
[Database] DB Transaction Isolation Level(트랜잭션 격리 수준) 완전타파 (0) | 2022.11.23 |
---|---|
[Database] 6-2. Introduction to SQL (0) | 2022.02.26 |
[Database] 6-1. Relational Algebra (0) | 2022.02.26 |
[Database] 5. Physical Database Design (0) | 2022.02.25 |
[Database] 4-2. Logical Database Design (0) | 2022.01.30 |