1. MySQL Index
- 이번 글에서는 MySQL에서 인덱스를 직접 생성, 조회, 삭제하는 방법과 인덱스가 실제로 사용되는지 확인하는 방법을 알아보겠습니다.
기본 개념 참고
인덱스에 대한 기본적인 내용은 Index 문서를 참고해주세요.
2. CREATE INDEX - 인덱스 생성하기
- 가장 기본이 되는 인덱스 생성 명령어는
CREATE INDEX입니다. - 인덱스를 생성하면 데이터베이스는 지정한 컬럼의 값들을 읽어서 정렬한 뒤, 인덱스 구조를 디스크에 저장합니다.
2.1 기본 문법
CREATE INDEX 인덱스이름 ON 테이블이름 (컬럼1, 컬럼2, ...);
- 인덱스 이름: 생성할 인덱스에 고유한 이름을 붙여줍니다. 보통
idx_테이블명_컬럼명과 같은 규칙으로 지으면 관리 하기 편합니다. - 테이블 이름: 인덱스를 생성할 대상 테이블입니다.
- 컬럼: 인덱스를 구성할 컬럼입니다. 하나 이상의 컬럼을 지정할 수 있습니다.
2.2 실습 예제
items테이블에서 특정item_name으로 상품을 검색하는 경우가 많다고 가정하고,item_name컬럼에 대한 인덱스를 생성해 보겠습니다.
CREATE INDEX idx_items_item_name ON items (item_name);
인덱스 생성 과정
이 쿼리를 실행하면 데이터베이스는 items 테이블의 모든 item_name 값을 읽어 정렬한 뒤, idx_items_item_name 인덱스를 디스크에 생성합니다. 테이블의 데이터가 많을수록 이 작업은 시간이 오래 걸릴 수 있습니다.
3. SHOW INDEX - 테이블의 인덱스 정보 확인하기
- 테이블에 어떤 인덱스들이 생성되어 있는지 확인하려면
SHOW INDEX명령어를 사용합니다. - 이 명령어를 통해 테이블에 걸려있는 모든 인덱스의 정보를 한눈에 볼 수 있습니다.
3.1 items 테이블 인덱스 확인
SHOW INDEX FROM items;
실행 결과
| Table | Non_unique | Key_name | Column_name | Cardinality |
|---|---|---|---|---|
| items | 0 | PRIMARY | item_id | 25 |
| items | 1 | fk_items_sellers | seller_id | 10 |
| items | 1 | idx_items_item_name | item_name | 25 |
- 결과를 자세히 살펴보겠습니다.
- Key_name: 인덱스의 이름입니다. 우리가 방금 만든
idx_items_item_name이 보입니다. - Column_name: 해당 인덱스가 어떤 컬럼을 기반으로 만들어졌는지 보여줍니다.
- PRIMARY와 fk_items_sellers: 우리는
item_name컬럼에 대한 인덱스만 만들었는데PRIMARY와fk_items_sellers라는 인덱스가 이미 존재합니다. - Non_unique:
1이면 중복 값을 허용하는 인덱스,0이면 중복을 허용하지 않는 고유 인덱스(UNIQUE또는PRIMARY KEY)를 의미합니다. - Cardinality: 인덱스에 저장된 유니크한 값의 개수에 대한 추정치입니다. 이 값이 높을수록 중복도가 낮다는 의미이며, 인덱스의 성능이 좋다고 판단할 수 있습니다.
자동 생성되는 인덱스
MySQL에서는 PRIMARY KEY(기본 키)나 FOREIGN KEY(외래 키) 제약조건을 설정하면, 해당 컬럼에 대해 자동으로 인덱스를 생성합니다. item_id는 기본 키이므로 PRIMARY 인덱스가, seller_id는 외래 키이므로 fk_items_sellers 인덱스가 이미 존재했던 것입니다. (UNIQUE 제약조건도 마찬가지로 인덱스가 생성됩니다.)