2025-08-28
오늘 배운 것
8.1 디스크 읽기 방식
- 데이터 베이스의 성능 튜닝 목적 : 디스크 I/O 줄이기
8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD)
- 하드 디스크 : 기계식 디스크 장치로 데이터베이스 서버에서 병목 원인
- SSD : 기존 하드 디스크 드라이브에서 데이터 저장용 플래터(원판)를 제거하고 그 대신 플레시 메모리를 장착
- 디스크 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있음
- 플래시 메모리는 전원이 공급되지 않아도 데이터가 삭제되지 않음
- 컴퓨터 메모리(DRAM)보다는 느리지만 기계식 하드 디스크 드라이브보다는 훨씬 빠름
- 순차 I/O에서는 HDD나 SSD나 성능이 비슷하지만 랜덤 I/O는 SSD가 훨씬 빠름
- DBMS는 랜덤 I/O의 작업이 대부분이기 때문에 SSD는 DBMS용 스토리에 최적
8.1.2 랜덤 I/O와 순차 I/O
- 순차 I/O : 디스크의 연속된 주소(블록)를 차례대로 읽고씀 → 한번에 크게 읽고 씀
- 랜덤 I/O : 디스크 여기저기 흩어진 주소를 뛰어다니며 읽고 씀 → 단위가 작음
- 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 의해 결정
- 따라서 여러번 쓰기 또는 읽기를 요청하는 랜덤 I/O 작업이 부하가 훨씬 더 큼
- SSD는 디스크 헤더가 없어서 두 I/O 성능 차이가 없을 것 같지만 아님
- 랜덤 I/O가 순차 I/O 보다 전체 처리량이 많아서 성능이 좋지 않음
- 쿼리 튜닝의 목적 : 랜덤 I/O를 줄이기 위해 쿼리를 처리하는데 꼭필요한 데이터만 읽도로 쿼리 개선하는 것
- OLTP : 다수 사용자의 짧은 트랜잭션을 ACID로 즉시 처리하는 시스템이고, 정규화+인덱싱+짧은 트랜잭션과 동시성 제어가 핵심이다.
8.2 인덱스란?
- 인덱스 : 칼럼(또는 칼럼들)의 값과 해당 레코드가 저장된 주소를 키와 값의쌍으로 삼는 것
- 칼럼의 값을 이용해 항상 정렬된 상태를 유지
- 데이터의 저장 성능을 희생하고 그 대신 데이터의 읽기 속도를 높이는 기능
- WHERE 조건절에 쓰이는 컬럼을 전부 인덱스로 생성하면 안되는 이유
- 쓰기 비용 증가
- INSERT/UPDATER/DELETE할 때마다 관련된 인덱스 전부 갱신해야됌
- 인덱스의 저장공간 및 메모리 차지 비율 증가
- 인덱스 증가 → 디스크 용량, 버퍼풀 메모리 증가 → 버퍼풀 히트율 감소 → 디스크 읽기 증가 → 전체 속도 감소
- 인덱스 데이터 관리방식
- B-Tree
- 칼럼의 값을 변형하지 않고 원래의 값을 이용해 인덱싱하는 알고리즘
- Hash
- 칼럼의 값으로 해시값을 계산해서 인덱싱하는 알고리즘
- 매우 빠른 검색을 지원
- prefix 검색과 같은 값의 일부 검색이나 범위 검색할 때는 사용 불가
- 메모리 기반의 데이터 베이스에서 많이 사용
- 중복 허용 여부
- 유니크 인덱스
- 동등 조건 검색 시 옵티마이저에게 하나 찾으면 더이상 찾지 않아도 된다고 알려줄 수 있음
- 비유니크 인덱스
- 기능별 분류