랜덤 IO와 순차 IO
- 하드 디스크와 같은 기계 장치의 성능은 별로 좋지 않음
- 순차 IO : 디스크에 연속적으로 저장되어 있는 데이터를 읽는 것
- 랜덤 IO : 디스크에 랜덤으로 저장되어 있는 데이터를 읽는 것
- 당연히 순차 IO 성능이 훨씬 좋음
인덱스란?
개념
- 데이터베이스에서 특정 컬럼의 데이터를 빠르게 검색할 수 있게 만들어주는 것으로, 책의 목차라고 생각하면 됨
- 내부적으로 컬럼 값과 레코드의 주소를 key-value 값으로 묶어놓음

동작 방식 예시
- B-트리를 예시로 들면 SELECT * FROM USER WHERE ID = 2 라는 쿼리가 실행되고, ID에 인덱스가 걸려있다고 가정
- 트리 구조로 저장되어 있기 때문에 O(logn)으로 ID=2임을 찾고 해당 주소로 가서 값을 반환
추가 궁금증 : MySQL에서 B-트리 사용하면 범위 연산에는 약한가?
특징
- 주로 B-트리, B+트리를 자료구조로 사용하고, MySQL은 B-트리가 디폴트
- WHERE 절에 자주 사용되고, 카디널리티가 높은 (중복도가 낮은) 컬럼을 인덱스로 설정
- 중복도가 낮은 컬럼으로 인덱스를 만들어야 바로 트리 구조로 값을 찾을수 있음
- 인덱스는 삽입, 수정, 삭제 성능을 떨어뜨리기 때문에 자주 변경되는 테이블에는 걸지 않는 것이 좋음
- 추가로 인덱스는 저장공간을 그만큼 차지함으로 꼭 필요한 경우에만 사용해야 함
- 쿼리 실행 계획을 EXPLAIN 키워드를 통해 확인 할수 있고, 인덱스를 잘 타고 있는지도 확인이 가능하다.
인덱스의 종류
커버링 인덱스
- 인덱스만으로 쿼리를 처리할 수 있는 경우
- 테이블을 읽지 않고, 인덱스에서 필요한 데이터를 모두 가져올 수 있음
- I/O 비용이 줄어들어 성능이 향상
예시 (name, city로 인덱스가 만들어져 있는 경우)
SELECT name, city FROM users WHERE name = 'Alice';
다중 컬럼 인덱스
- 두개 이상의 컬럼으로 만들어진 인덱스
- 주의!! : 인덱스의 두 번째 컬럼은 첫 번째 컬럼에 의존해서 정렬
예시 (name으로 먼저 찾고, 그 뒤에 age로 찾는다)
CREATE INDEX idx_name_age ON users (name, age);
Hash 인덱스
- B-트리, B+트리가 아닌 해시값을 계산해서 인덱스, 값이 적을땐 빠를수 있어도 값이 많아지면 충돌이 발생하여 B 트리 인덱스랑 성능이 비슷해진다.
- 순서가 없기 때문에 범위 검색에서 사용될 수 없다.

클러스터링 인덱스
- 클러스터링은 모여있는 이라는 뜻
- 클러스터링 인덱스란 데이터의 물리적 저장 위치를 결정하는 키 값 -> 랜덤 IO 방
- MySQL은 PK가 자동으로 클러스터링 인덱스로 걸어지고 그다음에 거는 인덱스는 세컨더리 인덱스임
인덱스의 스캔 방식
인덱스 레인지 스캔
- 시작 부분을 B+트리를 타고 내려가면서 찾고, 끝 부분까지 수평적으로 쭉 탐색
- 인덱스를 잘 탄 경우 발생
인덱스 풀 스캔
- 인덱스의 처음부터 끝까지 모두 스캔
- 인덱스에 잘 못 탔을때 발생
- ex) a,b,c에 복합 인덱스 걸려 있는데 where = (b컬럼) 으로 찾을 때

'데이터베이스' 카테고리의 다른 글
[데이터베이스] 정규화 (1) | 2025.02.19 |
---|---|
[데이터베이스] 데이터베이스란? (0) | 2025.02.07 |
[데이터베이스] 관계형 DB 문법 정리 (0) | 2022.11.16 |
랜덤 IO와 순차 IO
- 하드 디스크와 같은 기계 장치의 성능은 별로 좋지 않음
- 순차 IO : 디스크에 연속적으로 저장되어 있는 데이터를 읽는 것
- 랜덤 IO : 디스크에 랜덤으로 저장되어 있는 데이터를 읽는 것
- 당연히 순차 IO 성능이 훨씬 좋음
인덱스란?
개념
- 데이터베이스에서 특정 컬럼의 데이터를 빠르게 검색할 수 있게 만들어주는 것으로, 책의 목차라고 생각하면 됨
- 내부적으로 컬럼 값과 레코드의 주소를 key-value 값으로 묶어놓음

동작 방식 예시
- B-트리를 예시로 들면 SELECT * FROM USER WHERE ID = 2 라는 쿼리가 실행되고, ID에 인덱스가 걸려있다고 가정
- 트리 구조로 저장되어 있기 때문에 O(logn)으로 ID=2임을 찾고 해당 주소로 가서 값을 반환
추가 궁금증 : MySQL에서 B-트리 사용하면 범위 연산에는 약한가?
특징
- 주로 B-트리, B+트리를 자료구조로 사용하고, MySQL은 B-트리가 디폴트
- WHERE 절에 자주 사용되고, 카디널리티가 높은 (중복도가 낮은) 컬럼을 인덱스로 설정
- 중복도가 낮은 컬럼으로 인덱스를 만들어야 바로 트리 구조로 값을 찾을수 있음
- 인덱스는 삽입, 수정, 삭제 성능을 떨어뜨리기 때문에 자주 변경되는 테이블에는 걸지 않는 것이 좋음
- 추가로 인덱스는 저장공간을 그만큼 차지함으로 꼭 필요한 경우에만 사용해야 함
- 쿼리 실행 계획을 EXPLAIN 키워드를 통해 확인 할수 있고, 인덱스를 잘 타고 있는지도 확인이 가능하다.
인덱스의 종류
커버링 인덱스
- 인덱스만으로 쿼리를 처리할 수 있는 경우
- 테이블을 읽지 않고, 인덱스에서 필요한 데이터를 모두 가져올 수 있음
- I/O 비용이 줄어들어 성능이 향상
예시 (name, city로 인덱스가 만들어져 있는 경우)
SELECT name, city FROM users WHERE name = 'Alice';
다중 컬럼 인덱스
- 두개 이상의 컬럼으로 만들어진 인덱스
- 주의!! : 인덱스의 두 번째 컬럼은 첫 번째 컬럼에 의존해서 정렬
예시 (name으로 먼저 찾고, 그 뒤에 age로 찾는다)
CREATE INDEX idx_name_age ON users (name, age);
Hash 인덱스
- B-트리, B+트리가 아닌 해시값을 계산해서 인덱스, 값이 적을땐 빠를수 있어도 값이 많아지면 충돌이 발생하여 B 트리 인덱스랑 성능이 비슷해진다.
- 순서가 없기 때문에 범위 검색에서 사용될 수 없다.

클러스터링 인덱스
- 클러스터링은 모여있는 이라는 뜻
- 클러스터링 인덱스란 데이터의 물리적 저장 위치를 결정하는 키 값 -> 랜덤 IO 방
- MySQL은 PK가 자동으로 클러스터링 인덱스로 걸어지고 그다음에 거는 인덱스는 세컨더리 인덱스임
인덱스의 스캔 방식
인덱스 레인지 스캔
- 시작 부분을 B+트리를 타고 내려가면서 찾고, 끝 부분까지 수평적으로 쭉 탐색
- 인덱스를 잘 탄 경우 발생
인덱스 풀 스캔
- 인덱스의 처음부터 끝까지 모두 스캔
- 인덱스에 잘 못 탔을때 발생
- ex) a,b,c에 복합 인덱스 걸려 있는데 where = (b컬럼) 으로 찾을 때

'데이터베이스' 카테고리의 다른 글
[데이터베이스] 정규화 (1) | 2025.02.19 |
---|---|
[데이터베이스] 데이터베이스란? (0) | 2025.02.07 |
[데이터베이스] 관계형 DB 문법 정리 (0) | 2022.11.16 |