이미 전에 인덱스랑 한번쯤은 만났을 거야. 오늘은 인덱스에 대해 제대로 파헤쳐볼 거니까, 어떻게 동작하는지 확실히 이해할 수 있을 거야. 인덱스 진짜 좋은 거야, 쿼리 속도를 수백, 수천 배까지 올려줄 수 있거든. 분명히 마음에 들 거야. 근데 인덱스가 도대체 뭐냐고?
엄청 큰 도서관에서 원하는 책을 찾는다고 상상해봐. 아무런 순서 없이 찾으려면 진짜 한세월 걸릴 거야. 그래서 보통 책들은 알파벳 순이나 카테고리별로 정리돼 있지. 데이터베이스에서 인덱스도 딱 그런 원리로 동작해.
정확하게 말하면 인덱스 — 이건 테이블에서 행을 빠르게 찾으려고 만든 특별한 추가 데이터 구조야. 덕분에 원하는 정보를 찾으려고 뒤져야 하는 데이터 양이 확 줄어들지.
어떻게 보면 인덱스는 백과사전의 목차랑 비슷해. 책 자체를 테이블이라고 생각해봐.
백과사전을 처음부터 끝까지 다 읽는 대신, 목차 보고 바로 원하는 페이지로 갈 수 있잖아.
예를 들어 employees 테이블에 직원이 10만 명 있다고 해보자. "민"이라는 성을 가진 직원을 찾으려면, 인덱스 없으면 테이블의 모든 레코드를 다 봐야 해(진짜 오래 걸림). 인덱스 있으면 훨씬 빨라져, 왜냐면 Postgres가 어디서 찾아야 할지 아니까.
인덱스는 어떻게 동작할까?
인덱스가 쿼리를 어떻게 빠르게 해주는지 알려면, 뒤에서 무슨 일이 일어나는지 알아야 해. 인덱스는 테이블의 한 개 또는 여러 컬럼을 기반으로 만들어지고, 데이터를 검색하기 편한 구조로 정리해줘.
PostgreSQL에서 인덱스는 보통 B-Tree (균형 트리) 구조를 써. 어떻게 동작하는지 볼까:
- 인덱스 생성: 인덱스를 만들 컬럼의 데이터가 트리 구조로 정리돼.
- 검색할 때: PostgreSQL은 인덱스를 써서 원하는 행을 빠르게 찾아. 테이블 전체를 훑지 않아도 돼.
- 트리 구조: 트리는 정렬돼 있어서, 한 레코드에서 다른 레코드로 빠르게 이동할 수 있어(이진 탐색 알고리즘).
예시: 100만 개 행이 있는 테이블이 있다고 해보자. 인덱스 없으면 백만 개 다 확인해야 해. 인덱스 있으면 PostgreSQL이 수십 번만에 찾을 수 있어.
언제 인덱스를 써야 할까?
인덱스는 읽기 작업, 예를 들어 검색, 필터링, 정렬 같은 걸 엄청 빠르게 해줘. 근데 그만큼 쓰기 작업(INSERT, UPDATE, DELETE 같은 거)은 느려질 수 있어. 왜냐면 데이터가 바뀔 때마다 인덱스도 같이 업데이트해야 하거든.
인덱스가 꼭 필요한 상황
검색 쿼리가 자주 나올 때: 특정 값으로 자주 행을 찾는 경우, 예를 들어:
SELECT * FROM employees WHERE last_name = '민';
데이터 필터링: WHERE나 HAVING 조건을 쓸 때:
SELECT * FROM employees WHERE salary > 50000;
데이터 정렬: ORDER BY 쓸 때:
SELECT * FROM employees ORDER BY hire_date DESC;
테이블 조인(JOIN): 특정 컬럼을 기준으로 테이블을 자주 합칠 때.
*언제 *인덱스를 쓰지 말아야 할까
- 테이블이 진짜 작을 때(예를 들어 10~50개 행), 인덱스 써도 속도 차이 거의 없어.
- 인덱스 만들 컬럼이 쿼리에서 거의 안 쓰일 때.
- 컬럼 값이 진짜 적은 경우(예:
gender필드가 2~3개 값만 가질 때).
예시: status 필드에 "활성", "비활성" 두 값만 있을 때 인덱스 만드는 건 별로 의미 없어.
인덱스가 성능에 미치는 영향
봤다시피, 인덱스는 읽기 쿼리를 빠르게 해주지만, 쓰기 작업은 느려질 수 있어. 왜냐면 행을 추가, 수정, 삭제할 때마다 PostgreSQL이 인덱스 정보도 같이 바꿔야 하거든.
인덱스 사용과 성능의 균형
- 자주 바뀌는 테이블에는 인덱스 너무 많이 만들지 않는 게 좋아.
- 읽기 작업이 많은 테이블에는 인덱스가 필수야.
실생활에서 인덱스의 이점
실제로 인덱스는 이런 데서 많이 써:
- 웹앱 최적화: SQL 쿼리가 빨라져서 페이지 로딩 속도가 확 빨라져.
- 큰 테이블 다루기: 인덱스 없으면 수백만 행짜리 테이블 쿼리가 몇 분씩 걸릴 수도 있어.
- 확장성: 인덱스 덕분에 데이터가 많아져도 효율적으로 처리할 수 있어.
예를 들어, 상품이랑 주문 데이터베이스가 있는 인터넷 쇼핑몰은 인덱스 없으면 페이지 로딩에 몇 년 걸릴지도 몰라. 인덱스는 필수야!
GO TO FULL VERSION