-
[Real MySQL] 인덱스 (1) - 인덱스란? 인덱스의 구분✍️ 개인 스터디 기록 2022. 12. 12.
1. 디스크 읽기방식을 고려하자
랜덤 I/O와 순차I/O
디스크 헤더를 많이 움직이는 랜덤 I/O는 비용이 순차I/O보다 비용이 크다. SSD를 사용하면 랜덤 I/O의 비용을 줄일 수 있지만, 그래도 순차 I/O에 비해서는 성능이 떨어진다.
데이터베이스의 대부분의 작업은 작은 데이터를 빈번히 읽고 쓰는 작업이 대부분이기 때문에 랜덤 I/O가 일어나는데 쿼리 튜닝이란 이러한 랜덤 I/O 자체를 줄여주는것에 목적이 있다고 볼수 있다.(꼭 필요한 데이터만 읽도록 하는것!)
2. 인덱스란?
DBMS의 인덱스도 SortedList와 같이 항상 정렬된 상태를 유지한다.
즉 항상 정렬된 상태를 유지하기 위해 데이터가 저장될 때마다 항상 값을 정렬해야한다. 그렇기 때문에 인덱스란 데이터의 저장 성능을 희생하고 읽기 속도를 높이는 기능이다. 즉 인덱스를 설정할때는 저장 성능을 어느정도까지 희생할 지를 고려해야한다.
😱 WHERE절에서 사용하는 컬럼이라고 전부 인덱스로 설정해 버리면 저장성능이 떨어지고 인덱스의 크기가 커져서 오히려 역효과만 불러올 수 있다.
3. 인덱스의 구분
역할별 구분
- 프라이머리키:
그 레코드를 대표하는 값으로 NULL과 중복을 허용하지 않는다. - 보조키(세컨더리 키):
프라이머리 키를 제외한 모든 인덱스, 유니크 인덱스의 경우 프라이머리 키와 성격이 비슷해서 대체키라고도 불림
알고리즘 별 구분
- B-Tree 인덱스:
- 가장 일반적으로 사용되는 인덱스
- 컬럼 값을 그대로 가지고 인덱싱 한다.
- Hash 인덱스:
- 컬럼값을 해시값으로 변경해 인덱싱한다.
- 매우빠른 검색속도, 주로 메모리 기반 DB에서 사용
- 컬럼값 전체를 해시값으로 변경 하기 때문에 컬럼값의 일부만 가지고 검색을 할 수 없다.
데이터의 중복 여부로 구분
- 유니크 인덱스:
- 같은 값이 오직 1개만 존재 ⇒ 이는 옵티마이저 입장에서 매우 중요한 문제 (유니크한 컬럼에서 동등조건 비교(=)로 검색이 들어가면 1개만 찾고 더이상 검색을 수행하지 않아도 되기 때문)
- 논유니크 인덱스
'✍️ 개인 스터디 기록' 카테고리의 다른 글
[Real MySQL] 인덱스 (3) - B-Tree 인덱스를 통한 스캔 방식들 (0) 2022.12.12 [Real MySQL] 인덱스 (2) - B-Tree 인덱스 (0) 2022.12.12 모던 자바스크립트 Deep Dive 퀴즈 리스트 (0) 2022.12.02 [NodeJS] C10K Problem 과 NodeJS (1) 2022.11.27 [Node.js] 비동기와 Promise 이해하기 (0) 2022.11.27 - 프라이머리키: