인덱스(Index)
- 자료를 쉽고 빠르게 찾을 수 있도록 만든 데이터 구조
- B-tree 구조
- 인덱스는 WHERE 절에 자주 사용되는 속성이어야 한다.
- 인덱스는 ORDER BY 절에 자주 사용되는 속성이어야 한다.
- 인덱스는 조인에 자주 사용되는 속성이어야 한다.
- 조건절이 없다면 인덱스는 사용되지 않는다!
- 단일 테이블에 인덱스가 많으면 속도가 느려질 수 있다.(테이블 당 4~5개가 적절)
- 속성이 가공되는 경우 사용하지 않는다.
- INSERT / UPDATE / DELETE가 자주 발생하지 않는 컬럼
- 속성의 선택도(1/서로 다른 값의 개수)가 낮을 때 유리하다. (=카디널리티가 높은 것)
- 데이터의 양이 별로 없거나 데이터 값이 몇 종류 안 되면 인덱스가 없는 게 더 빠를 수 있다.
- 결합 인덱스는 순서가 중요하다.
- WHERE 절에서 equal 조건으로 많이 쓰이는 컬럼들이 앞으로 오는게 효율적이다.
- 또한, 분별력이 높은 컬럼이 앞으로 오는게 효율적이다.
- 테이블이 가지고 있는 전체 데이터 양의 10~15% 이내의 데이터가 출력이 될때만 인덱스 사용이 효율적
카디널리티
- 요소의 개수
- ex) 성별은 남, 여로 카디널리티가 2
인덱스 종류
Non-clustered Index | Clustered Index |
실제 데이터와 다른 무리의 별도의 인덱스 인덱스 키 값에는 해당 데이터에 대한 포인터가 존재 테이블에 여러 개의 Non-clustered index가 있을 수 있다. 별도의 인덱스 페이지를 생성해서 추가 공간 필요 unique 제약조건 적용시 자동 생성 직접 index 생성시 생성됨 |
실제 데이터와 같은 무리의 인덱스 데이터를 인덱스로 지정한 컬럼에 맞춰서 정렬 테이블에 하나의 Clustered index가 있을 수 있다. primary key 또는 unique + not null에 자동 생성됨 |
FullScan
- 데이터를 처음 ~ 끝까지 모두 스캔해서 데이터 조회
- 정렬되어 있지 않은 데이터
- 동일한 데이터의 양이 많은 경우 적합
- 데이터 규모가 크면 매우 비효율적
- 적용 가능한 인덱스가 없는 경우
- 인덱스 처리 범위가 넓은 경우
B-Tree(Balanced-Tree)
- 트리 높이가 같음
- 자식 노드를 2개 이상 가질 수 있음
- 기본 데이터베이스 인덱스 구조
참고 👇
http://www.tcpschool.com/mysql/mysql_index_create
https://www.ibm.com/docs/en/ias?topic=indexes-clustered-non-clustered
https://www.youtube.com/watch?v=uO8tL0okg7Q
https://www.saichoiblog.com/mongodb-index/
반응형
'DB' 카테고리의 다른 글
Sharding (0) | 2022.10.17 |
---|---|
SQL Injection (0) | 2022.08.30 |
[Error] ERR wrong number of arguments for 'zrangebyscore' command (0) | 2022.07.23 |
[ERROR] java.sql.SQLException: Field 'title' doesn't have a default value (0) | 2021.11.21 |
[MySQL] Error Code : 3780 (0) | 2021.11.19 |