데이터 저장 매체(디스크)는 컴퓨터에서 가장 느린 부분이다.
데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건일때가 상당히 많다.
하드 디스크는 기계식 장치다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다.
전자식 저장 매체인 SSD가 나왔다.
SSD는 플래시 메모리를 장착하고 있다. 디스크 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있다.
비휘발성이다.
랜덤I/O는 하드 디스크 드라이브의 원판을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미한다. 순차 I/O도 이 방식은 똑같다.
순차 I/O가 랜덤 I/O보다 약 3배정도 빠르다.
디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한번에 기록하느냐에 따라 결정된다.
인덱스 레인지 스캔은 데이터를 읽기 위해 랜덤I/O를 사용하며 풀 테이블 스캔은 순차I/O를 사용한다. 그래서 큰 테이블의 레코드 대부분을 읽는 작업에서는 인덱스를 사용하지 않고 풀 테이블 스캔을 사용하도록 유도할 때도 있다.
DB 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸린다.
칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 삼아 인덱스로 만들어 둔다.
인덱스는 칼럼의 값을 주어진 순서로 미리 정렬해서 보관한다.
인덱스는 저장될 때마다 항상 값을 정렬해야 하므로 저장하는 과정이 복잡하고 느리다.
이미 정렬돼 있어 아주 빨리 원하는 값을 찾아올 수 있다.
insert, update, delete는 느리지만 select는 매우 빠르게 처리할 수 있다.
인덱스는 저장 속도를 희생하고 데이터 읽기 속도를 높이는 기능이다.
저장 속도를 어디까지 희생할 수 있는지, 읽기 속도를 얼마나 더 빠르게 만들어야 하는지에 따라 결정해야 한다.
where 조건절에 사용되는 컬럼이라고 전부 인덱스로 생성하면 저장 성능이 떨어지기 때문에 주의해야 한다.
프라이머리 키와 보조키(세컨더리 인덱스)로 구분할 수 있다.
세컨더리 인덱스는 프라이머리 키 외의 인덱스다.