일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 코테
- 알고리즘
- Git
- nest.js
- mongo
- 피드백
- mongoose
- next.js
- Grafana
- 트러블슈팅
- 자바스크립트
- 회고
- js
- 기록
- react
- array
- MongoDB
- til
- mysql
- 네트워크
- WIL
- 주간회고
- typescript
- 생각정리
- javascript
- Java
- 생각로그
- 생각일기
- 리눅스
- CS
- Today
- Total
코딩일상
[DataBase]인덱스란?? 본문
결론
데이터베이스에서 인덱스를 사용하는 이유는 검색성능을 향상시키기 위해서 이다.
하지만 검색성능을 실질적으로 향상시키기 위해서는 해당 쿼리가 index를 사용하는지
카디널리티, Selectivity 같은 요소들이 고려된 인덱스가 생성되어야 합니다.
일반적인 경우의 장점으로는 빠른 검색 성능을 들 수 있습니다.
일반적인 경우의 단점으로는 인덱스를 구성하는 비용 즉, 추가, 수정, 삭제 연산시에 인덱스를 형성하기 위한 추가적인 연산이 수행됩니다.
따라서, 인덱스를 생성할 때에는 트레이드 오프 관계에 놓여있는 요소들을 종합적으로 고려하여 생성해야합니다.
*트레이드오프: 객체의 어느 한부분의 품질을 높이거나 낮추는게, 다른 부분의 품질을 높이거나 낮추는데 영향을 끼치는 상황을 이야기한다
Index란?
사전 의 목차라고 생각하면 편하다
원하는 키워드를 찾고싶은데 목차가 없다면 우리는 사전을 전부 뒤져보면서 찾아야 해서 상당히 찾는데 오래 걸릴것이다.
하지만 목차가 있음으로 인해 원하는 위치를 쉽고 빠르게 찾을수 있다.
데이터베이스에도 마찬가지
DB의 특정 테이블에서 원하는 데이터들을 조회할 때, 조건절에 사용하는 컬럼의 Index가 없다면 어떻게 될까?
책의 사례와 유사하게, 원하는 데이터의 위치를 특정할 힌트가 없다보니 테이블 전체를 탐색(Full Scan)하게 됩니다.
테이블에 데이터의 양이 많아질수록 검색에 소요되는 시간이 길어집니다.
Index 자료구조
DB Index에 적합한 자료 구조로는 크게 Hash Table, B-Tree, B+Tree 등이 있습니다
(이부분에 대해서 따로 정리 해서 포스팅하게습니다.)
고려해야할점
Index를 사용하면 조회 성능이 좋아진다.
하지만 아무렇게 컬럼에 Index를 적용하는 것은 오히려 성능이 저하되는 역효과가 발생할 수 있음
Index는 항상 최신 상태로 정렬되기 위해, 데이터 갱신(INSERT, UPDATE, DELETE) 작업에 대해 추가적인 연산이 발생기 때문
- INSERT : 새로운 데이터에 대한 인덱스가 추가된다.
- DELETE : 삭제하는 데이터의 인덱스를 제거한다.
- UPDATE : 기존의 인덱스를 제거하고, 갱신된 데이터에 대해 인덱스를 추가한다.
Index 대상 컬럼 선정
일반적으로 Cardinality가 높은 컬럼을 우선적으로 인덱싱하는 것이 검색 성능에 유리
Cardinality란 특정 데이터 집합의 유니크(Unique)한 값의 개수를 의미
- 남-여 등 2가지 값만 존재하는 성별 컬럼은 중복도가 높으며 카디널리티가 낮습니다.
- 개인마다 고유한 값이 존재하는 주민번호 컬럼은 중복도가 낮으며 카디널리티가 높습니다.
Cardinality 높은 컬럼의 경우, Index를 통해 데이터를 더 많이 필터링할 수 있기 때문입니다.
앞서 살펴본 Index 트리 자료 구조는 값이 추가 혹은 삭제될 때마다, 트리 균형을 위해 트리 구조의 재분배 및 합병 등 복잡한 연산이 수반됩니다. 따라서 데이터 갱신보다는 조회에 주로 사용되는 컬럼에 Index를 생성하는 것이 유리합니다
인덱스 설정방법
MySQL 인덱스 조회 생성 수정 삭제 및 타는지 확인방법
MySQL에서 인덱스는 테이블을 빨리 조회하기 위해 테이블 데이터에 포인터를 주는 것인데 인덱스는 책의 목차와도 같아서 특정 컬럼에 인덱스를 지정해주면 테이블 조회 시 인덱스를 이용해 빠
wakestand.tistory.com
'개발 공부 > DataBase' 카테고리의 다른 글
MySQL NOW()와 SYSDATE()의 차이 (0) | 2023.01.07 |
---|---|
RDBMS,SQL,NoSQL..뭐지?? (0) | 2022.08.07 |