데이터베이스에서 인덱스는 테이블의 특정 컬럼에 대한 데이터를 효율적으로 검색할 수 있도록 도와주는 자료 구조이다.
MySQL에서 인덱스는 B-Tree나 Hash와 같은 자료 구조로 구현되어 있으며, 데이터베이스 엔진이 검색 작업을 최적화하도록 돕는다.
인덱스를 사용하면 데이터 검색 속도가 빨라지는 이유는 테이블의 데이터를 B-Tree와 같은 효율적인 자료 구조에 저장하기 때문이다.
SELECT * FROM employees WHERE employee_id = 123;
CREATE INDEX idx_employee_name ON employees (name);
CREATE INDEX idx_employee_name_department ON employees (name, department_id);
복합 인덱스는 컬럼 순서에 따라 성능이 달라질 수 있다.
위의 인덱스는 (name, department_id) 조건으로 검색할 때 유효하지만, department_id만으로 검색할 때는 비효율적이다.
SHOW INDEX FROM employees;
장점
1. 검색 성능 향상 : WHERE, JOIN, ORDER BY 등의 속도가 빨라진다.
2. 고유성 보장 : PRIMARY KEY와 UNIQUE 제약 조건에서 데이터 무결성을 유지한다.
단점
1. 쓰기 성능 저하 : INSERT, UPDATE, DELETE 작업 시 인덱스를 함께 수정해야 하므로 비용이 증가한다.
2. 저장 공간 증가 : 인덱스 데이터 자체를 저장하기 위해 추가적인 공간이 필요하다.
3. 과도한 인덱스는 역효과 : 너무 많은 인덱스를 생성하면 쿼리 최적화에 오히려 부정적인 영향을 줄 수 있다.