Read와 Write ?

프로젝트(MoovDa)의 기능은 영화 검색, 영화 상세 조회, 코멘트 작성, 질문 답변 작성 등이 있다. 우리 서비스의 읽기 대비 쓰기의 비율은 얼마나 될까? 대부분의 서비스는 Read가 Write보다 대략 7:3, 8:2비율로 더 많다. 예를 들어 10,000명의 SNS 팔로워가 있다고 가정해 보자. 내가 게시글을 하나 올리고 팔로워들 중 10% 가량이 그 게시글을 확인한다면, 하나의 쓰기가 1000번의 읽기로 귀결된다. 읽기 속도와 대용량 처리를 위한 서비스 구성에 대해 고민해 본다.

1. Index

Index는 DB에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. Index는 테이블 내 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다.

SELECT * FROM USER WHERE COMPANY_ID = ?

DB의 특정 테이블에서 원하는 데이터들을 조회할 때, 조건절에 사용하는 컬럼의 Index가 없다면, 원하는 데이터의 위치를 특정할 힌트가 없다 보니 테이블 전체를 탐색(Full Scan)하게 된다. 테이블에 데이터의 양이 많아질수록 검색에 소요되는 시간이 길어진다.

인덱스에 대하여.png

Index는 데이터의 주솟값을 저장하는 별도의 특별한 자료 구조이다. USER 테이블의 COMPANY_ID 컬럼에 대한 Index가 존재한다면, 예시 쿼리를 수행할 때 테이블 전체를 탐색하지 않고 해당 Index를 바탕으로 원하는 데이터의 위치를 빠르게 검색한다. Index는 테이블에 있는 하나 이상의 컬럼으로 생성이 가능하다.

단점

“그럼 읽기에는 전부 Index 테이블을 생성해 주면 되겠네 !“ 라고 생각했는데, 장점이 있으면 단점도 있다. 언제나 trade off가 존재한다.

Index를 사용하면 좋은 경우