✨Index?
인덱스는 데이터베이스 테이블의 특정 컬럼에 대해 빠른 검색을 가능하게 하는 데이터 구조입니다. 책의 색인처럼, 인덱스는 데이터의 위치를 신속하게 찾아낼 수 있도록 돕습니다. 데이터베이스에서 인덱스를 사용하면 검색, 정렬, 필터링 작업을 더욱 효율적으로 처리할 수 있습니다.
- 숫자, 날짜, 텍스트 데이터에서의 정확한 일치 검색에 사용
- 데이터를 빠르게 조회하고 정렬하는 데 사용
- 테이블 간의 조인 작업을 빠르게 수행할 수 있음
인덱스의 기본 구조
- 인덱스는 데이터베이스에서 다양한 형태로 구현될 수 있으며, 가장 일반적인 구조는 B-트리(Balanced Tree)입니다.(여기서 자세한 자료 구조 설명은 생략하겠습니다..ㅎㅎ)
1. B-트리 인덱스
- 특징: 균형 잡힌 트리 구조로, 모든 노드가 정렬된 상태를 유지
- 장점: 검색, 삽입, 삭제 작업의 시간 복잡도가 O(log N)
2. 해시 인덱스
- 특징: 해시 함수를 사용하여 키와 데이터의 위치를 매핑
- 장점: 고정된 크기의 해시 테이블을 사용하여 빠른 조회 성능을 제공
3. 비트맵 인덱스
- 특징: 각 값을 비트로 표현하여 효율적인 압축과 검색을 제공
- 장점: 대량의 데이터를 빠르게 검색할 수 있지만, 업데이트가 자주 발생하는 경우 성능이 저하될 수 있음
📌인덱스 종류
1. 단일 컬럼 인덱스
- 설명: 단일 컬럼에 대해 생성되는 인덱스
- 사용 예: 특정 컬럼의 검색 성능을 향상시키는 데 사용
2. 복합 인덱스
- 설명: 두 개 이상의 컬럼에 대해 생성되는 인덱스
- 사용 예: 여러 컬럼을 기준으로 검색하거나 정렬할 때 유용
3. 유니크(Unique) 인덱스
- 설명: 인덱스가 생성된 컬럼에 대해 중복된 값이 없음을 보장
- 사용 예: 사용자 ID나 이메일 주소와 같이 유일해야 하는 값을 다룰 때 사용
4. 풀 텍스트(Full-Text) 인덱스
- 설명: 텍스트 데이터에 대해 효율적인 검색을 지원합니다.
- 사용 예: 문서, 블로그 게시물 등의 텍스트를 검색할 때 사용됩니다.
🔮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를 생성해서 해당 컬럼의 값을 정렬하여 빠르게 검색이 가능함
- 인덱스 사용 시 고려해야할 점
- 데이터가 변경되면 인덱스도 업데이트 해야하므로 추가 비용이 발생함.
- 즉, 조회는 빨라지는데 삽입, 삭제, 수정에는 추가적인 비용이 듬
- 인덱스를 수정할 때 DB에 Lock이 걸리고...
🪄index 최적화
- 복합 index 사용
- 여러 컬럼을 동시에 검색할 때는 복합 index를 사용하는 것이 좋을 수도 있음
- ex) name, department를 함께 자주 검색한다면 하나의 인덱스에서 2개의 컬럼을 사용
- 함수나 연산자를 사용하지 않도록 쿼리 작성
- ex) 아래처럼 연산자를 사용하면 인덱스 사용의 장점을 적절히 사용할 수 없음
SELECT * FROM member WHERE UPPER(last_name) = 'KIM';
- 상황에 따라 적절한 index 관리가 필요함
- explain 명령어를 통해 index 성능을 분석해보기
- 불필요한 index 제거 고려
- 필요한 index 추가 고려
'데이터 > 데이터베이스' 카테고리의 다른 글
[ElasticSearch] ElasticSearch 개념 정리 (0) | 2024.10.24 |
---|---|
[Database] DB Lock의 종류와 DeadLock (0) | 2024.08.19 |
[Database] MySQL User 생성 (0) | 2024.07.24 |
[Database] DB Session & Connection (0) | 2024.07.24 |
[Database] Transaction과 ACID (0) | 2024.07.05 |