Lsiron
MySQL의 Index 본문
인덱스(Index)란?
인덱스는 데이터베이스 테이블의 데이터를 빠르게 검색하기 위해 사용되는 데이터 구조이다. 인덱스는 책의 색인처럼 작동하며, 테이블의 특정 열(column)에 대한 값을 기반으로 빠른 조회를 가능하게 한다. 인덱스를 사용하면 데이터 검색, 정렬, 집계 작업의 성능이 크게 향상된다.
인덱스를 사용하는 상황
인덱스를 사용하는 상황은 다음과 같다.
- 검색 속도 향상:
- 테이블에서 특정 조건을 만족하는 데이터를 빠르게 찾기 위해.
- 예: 특정 고객 ID로 주문을 검색할 때.
- 정렬 및 범위 조회:
- 데이터를 정렬하거나 특정 범위 내의 데이터를 조회할 때.
- 예: 날짜 범위 내의 주문을 조회할 때.
- 유일성 보장:
- 특정 열의 값이 중복되지 않도록 하기 위해.
- 예: 유니크한 이메일 주소를 보장하기 위해.
- 조인 성능 향상:
- 여러 테이블을 조인할 때 조인의 성능을 향상시키기 위해.
- 예: 고객 테이블과 주문 테이블을 조인할 때.
인덱스의 예시
1. 기본 인덱스 생성
가장 일반적인 인덱스는 단일 열에 대해 생성된다.
예를 들어, customers 테이블의 customer_id 열에 인덱스를 생성할 수 있다.
CREATE INDEX idx_customer_id ON customers(customer_id);
이 인덱스는 customer_id를 기준으로 빠른 검색을 가능하게 한다.
2. 복합 인덱스 생성
두 개 이상의 열에 대해 인덱스를 생성할 수도 있다.
예를 들어, orders 테이블의 customer_id와 order_date 열에 복합 인덱스를 생성할 수 있다.
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);
이 인덱스는 특정 고객의 특정 날짜에 대한 주문을 빠르게 찾을 수 있도록 도와준다.
3. 유니크 인덱스 생성
유니크 인덱스는 인덱스 열에 있는 값이 고유해야 함을 보장한다.
예를 들어, customers 테이블의 email 열에 유니크 인덱스를 생성할 수 있다.
CREATE UNIQUE INDEX idx_unique_email ON customers(email);
이 인덱스는 각 고객의 이메일 주소가 중복되지 않도록 한다.
4. PRIMARY KEY 인덱스
기본 키(primary key)도 인덱스의 한 형태로, 기본 키는 자동으로 유니크 인덱스를 생성한다.
예를 들어, customers 테이블의 customer_id 열을 기본 키로 설정할 수 있다.
ALTER TABLE customers
ADD PRIMARY KEY (customer_id);
인덱스 사용 예시
customers 테이블
customer_id | name | |
1 | Alice | alice@example.com |
2 | Bob | bob@example.com |
3 | Charlie | charlie@example.com |
orders 테이블
order_id | customer_id | order_date |
101 | 1 | 2023-01-01 |
102 | 2 | 2023-01-02 |
103 | 1 | 2023-01-03 |
1. 기본 인덱스 사용
고객 ID로 주문을 검색할 때 인덱스가 있는 경우.
SELECT * FROM orders WHERE customer_id = 1;
customer_id에 인덱스가 있으면 이 쿼리는 매우 빠르게 실행된다.
2. 복합 인덱스 사용
특정 고객의 특정 날짜에 대한 주문을 검색할 때.
SELECT * FROM orders WHERE customer_id = 1 AND order_date = '2023-01-03';
customer_id와 order_date에 복합 인덱스가 있으면 이 쿼리도 빠르게 실행된다.
인덱스의 단점
인덱스는 검색 성능을 향상시키지만 몇 가지 단점도 있다.
- 추가 저장 공간 필요: 인덱스를 저장하기 위해 추가적인 디스크 공간이 필요하다.
- 쓰기 성능 저하: 데이터를 삽입, 업데이트, 삭제할 때 인덱스도 갱신해야 하므로 쓰기 작업의 성능이 저하될 수 있다.
- 복잡성 증가: 너무 많은 인덱스를 생성하면 오히려 성능이 저하될 수 있으며, 적절한 인덱스를 설계하는 것이 어려울 수 있다.
따라서 인덱스를 사용할 때는 데이터 조회 패턴을 잘 분석하여 적절한 인덱스를 설계하는 것이 중요하다.
'데이터베이스 > MySQL' 카테고리의 다른 글
MySQL로 게시판 CRUD 구현해보기. (Node.js, Express) (3) | 2024.07.14 |
---|---|
MySQL 서브쿼리(ANY, ALL) (0) | 2024.07.13 |
집계함수와 제어키워드 (0) | 2024.07.10 |
구글 클라우드를 통한 MySQL 배포하기 (0) | 2024.07.09 |
정규화와 역정규화 그리고 이상현상, 함수의 종속성 (2) | 2024.07.09 |