✨Index?
인덱스는 데이터베이스 테이블의 특정 컬럼에 대해 빠른 검색을 가능하게 하는 데이터 구조입니다. 데이터베이스에서 인덱스를 사용하면 검색, 정렬, 필터링 작업을 더욱 효율적으로 처리할 수 있습니다.
- 숫자, 날짜, 텍스트 데이터에서의 정확한 일치 검색에 사용합니다.
- 데이터를 빠르게 조회하고 정렬하는 데 사용합니다.
- 테이블 간의 조인 작업을 빠르게 수행할 수 있습니다.
인덱스의 기본 구조
- 인덱스는 데이터베이스에서 다양한 형태로 구현될 수 있으며, 가장 일반적인 구조는 B-트리(Balanced Tree)입니다.(여기서 자세한 자료 구조 설명은 생략하겠습니다..ㅎㅎ)
1. B-트리 인덱스
- 특징: 균형 잡힌 트리 구조로, 모든 노드가 정렬된 상태를 유지
- 장점: 검색, 삽입, 삭제 작업의 시간 복잡도가
O(log N)
2. 해시 인덱스
- 특징: 해시 함수를 사용하여 키와 데이터의 위치를 매핑
- 장점: 고정된 크기의 해시 테이블을 사용하여 빠른 조회 성능을 제공
3. 비트맵 인덱스
- 특징: 각 값을 비트로 표현하여 효율적인 압축과 검색을 제공
- 장점: 대량의 데이터를 빠르게 검색할 수 있지만, 업데이트가 자주 발생하는 경우 성능이 저하될 수 있음
Index 종류
1. 단일 컬럼 Index
- 단일 컬럼에 대해 생성되는 인덱스
- 사용 예: 특정 컬럼의 검색 성능을 향상시키는 데 사용합니다.
2. 복합 Index
- 두 개 이상의 컬럼에 대해 생성되는 인덱스
- 사용 예: 여러 컬럼을 기준으로 검색하거나 정렬할 때 유용합니다.
3. 유니크(Unique) Index
- 인덱스가 생성된 컬럼에 대해 중복된 값이 없음을 보장
- 사용 예: 사용자 ID나 이메일 주소와 같이 유일해야 하는 값을 다룰 때 사용합니다.
4. 풀 텍스트(Full-Text) Index
- 텍스트 데이터에 대해 효율적인 검색을 지원
- 사용 예: 문서, 블로그 게시물 등의 텍스트를 검색할 때 사용합니다.
🔮MySQL에서 인덱스 사용법
CREATE TABLE member(
id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(20),
first_name VARCHAR(40),
INDEX idx_last_name (last_name)
);
CREATE INDEX idx_first_name ON member(first_name);
SHOW INDEX FROM member;
DROP INDEX idx_first_name ON table_name;
- 다양한 데이터 타입으로 index 생성 가능합니다.
- 자주 사용되는 컬럼에 index를 생성하면 조회 성능이 향상됩니다.
- 특정 컬럼의 값을 기준으로 데이터의 위치를 빠르게 찾아줍니다. (B-Tree 기반으로 동작)
- 특정 컬럼에 index를 생성해서 해당 컬럼의 값을 정렬하여 빠르게 검색이 가능합니다.
Index 사용 시 고려해야할 점
- 데이터가 변경되면 인덱스도 업데이트 해야하므로 추가 비용이 발생합니다.
- 즉, 조회는 빨라지는데 삽입, 삭제, 수정에는 추가적인 비용이 듭니다.
- 인덱스를 수정할 때 DB에 Lock이 걸립니다.
🪄index 최적화
1. 복합 index 사용
-
여러 컬럼을 동시에 검색할 때는 복합 index를 사용하는 것이 좋을 수도 있습니다.
-
ex) name, department를 함께 자주 검색한다면 하나의 인덱스에서 2개의 컬럼을 사용
2. 함수나 연산자를 사용하지 않도록 쿼리 작성
3. 부분 인덱스 (Partial Indexes)
-
특정 조건을 만족하는 행에 대해서만 인덱스를 생성할 수 있습니다.
-
데이터 양이 많고, 특정 조건의 행만 자주 조회되는 경우 유용합니다.
-
ex) WHERE status = 'active'와 같은 조건 사용
CREATE INDEX idx_active_member ON member (last_name) WHERE status = 'active';
4. 인덱스 유지 관리
- 인덱스는 데이터베이스의 성능에 긍정적인 영향을 미치지만, 데이터가 삽입, 업데이트 또는 삭제될 때 인덱스가 갱신되어야 하므로 추가적인 오버헤드가 발생합니다.
- 정기적으로 인덱스를 리빌드하거나 통계 정보를 업데이트하여 최적의 성능을 유지할 수 있습니다.
5. 상황에 따라 적절한 index 관리
- explain 명령어를 통해 index 성능을 분석해보는 것도 좋습니다.
- 불필요한 index는 제거 고려, 필요한 index 추가 고려