1. MySQL 인덱스란? 데이터베이스 성능 향상의 핵심
인덱스를 효과적으로 사용하면 MySQL 데이터베이스에서 쿼리 성능을 크게 향상시킬 수 있습니다. 인덱스는 데이터베이스 테이블의 특정 컬럼에 생성되는 자료 구조로, 검색 및 필터링 속도를 높여 줍니다. 예를 들어 대용량 데이터셋에서 특정 정보를 추출할 때 인덱스를 사용하면 MySQL이 모든 행을 스캔하지 않고 인덱스가 적용된 컬럼만 검색하게 됩니다.
인덱스의 역할 및 종류
MySQL은 다음과 같은 종류의 인덱스를 제공합니다:
- PRIMARY (Primary Key) : 테이블당 한 번만 허용되는 고유 키로, 테이블의 주요 식별자로 사용됩니다.
- UNIQUE Index : 고유성을 강제하고 지정된 컬럼에 중복 값이 삽입되는 것을 방지하는 인덱스입니다.
- Regular Index : 고유성 제약이 없는 인덱스로, 특정 컬럼에 대한 검색 성능을 향상시키는 데 사용됩니다.
위와 같이 인덱스는 테이블에 대한 검색 및 데이터 작업 효율을 높여 주며, 대용량 데이터셋에서는 필수적입니다. 하지만 인덱스가 너무 많으면 INSERT와 UPDATE 작업이 느려질 수 있으므로 적절한 인덱스 관리가 중요합니다.
2. MySQL에서 인덱스를 확인하는 기본 방법
MySQL에서는 SHOW INDEX 명령을 사용해 기존 인덱스를 확인할 수 있습니다. 이 간단한 SQL 명령은 지정한 테이블의 인덱스 정보를 표시합니다. 구체적인 절차는 아래에서 설명합니다.
SHOW INDEX의 기본 구문 및 출력
SHOW INDEX FROM table_name;
출력 컬럼 설명
이 명령을 실행하면 다음과 같은 정보가 표시됩니다:
- Table : 인덱스가 존재하는 테이블 이름
- Non_unique : 인덱스가 중복을 허용하는지 여부(1 = 허용, 0 = 고유)
- Key_name : 인덱스 이름
- Column_name : 인덱스가 적용된 컬럼 이름
- Cardinality : 인덱스에 포함된 고유 값의 추정 개수. 검색 효율을 판단하는 지표로 사용됩니다.
이 정보를 활용하면 테이블 내 인덱스 현황과 각 컬럼에 인덱스가 어떻게 적용되어 있는지를 시각적으로 파악할 수 있습니다. 필요에 따라 WHERE 절을 사용해 결과를 좁힐 수도 있습니다.
3. INFORMATION_SCHEMA.STATISTICS 테이블을 이용한 인덱스 확인
SHOW INDEX 문 외에도 MySQL에서는 INFORMATION_SCHEMA.STATISTICS 테이블을 조회해 인덱스를 확인할 수 있습니다. 이 방법은 전체 데이터베이스에 걸친 인덱스 목록을 얻을 때 유용하며, 보다 상세한 정보를 제공합니다.
INFORMATION_SCHEMA.STATISTICS 기본 조회
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'database_name';
조회 결과 상세 설명
- TABLE_SCHEMA : 인덱스가 속한 데이터베이스 이름
- TABLE_NAME : 인덱스가 존재하는 테이블 이름
- COLUMN_NAME : 인덱스가 적용된 컬럼 이름
- INDEX_NAME : 인덱스 이름
이 방법을 사용하면 여러 테이블 또는 특정 데이터베이스에 대한 인덱스 정보를 한 번에 리스트 형태로 확인할 수 있습니다. 전체 데이터베이스의 인덱스를 관리할 때 특히 유용합니다.

4. 인덱스 추가·삭제 방법 및 영향
인덱스 추가 방법
필요에 따라 나중에 인덱스를 추가할 수 있습니다. 지정한 컬럼에 인덱스를 생성하려면 다음 명령을 사용합니다:
CREATE INDEX index_name ON table_name(column_name);
예를 들어 users 테이블의 email 컬럼에 인덱스를 추가하고 싶다면 다음과 같이 실행합니다:
CREATE INDEX idx_email ON users(email);
인덱스 삭제 방법
불필요한 인덱스를 제거하면 INSERT와 UPDATE 성능을 최적화할 수 있습니다. 인덱스를 삭제하려면 DROP INDEX 명령을 사용합니다:
DROP INDEX index_name ON table_name;
불필요한 인덱스의 예는 검색 조건(WHERE 절)에서 사용되지 않는 열에 생성된 인덱스입니다. 이러한 인덱스를 제거하면 데이터 삽입 및 업데이트 속도를 향상시킬 수 있습니다.
5. EXPLAIN 문을 사용한 인덱스 성능 확인
MySQL EXPLAIN 문은 쿼리 실행 계획을 확인하고 어떤 인덱스가 사용되고 있는지 식별하는 데 유용합니다. 이를 통해 인덱스의 효율성을 평가하고 필요에 따라 성능을 최적화할 수 있습니다.
EXPLAIN 문의 기본 사용법
EXPLAIN SELECT * FROM table_name WHERE column_name = 'condition';
이 명령을 사용하면 인덱스가 사용되고 있는지 또는 전체 테이블 스캔이 수행되는지를 확인할 수 있습니다. 결과에는 다음과 같은 열이 포함됩니다:
- type : 쿼리 유형 (ALL은 전체 테이블 스캔을 의미하고, INDEX는 인덱스가 사용됨을 의미합니다)
- possible_keys : 쿼리에 사용할 수 있는 인덱스 목록
- key : 실제로 사용된 인덱스 이름
- rows : 스캔된 행 수의 추정값
이 정보를 기반으로 인덱스의 효율성을 분석하고 검색 성능 향상이 필요한지 여부를 판단할 수 있습니다.
6. 결론
적절한 인덱스 관리는 MySQL 데이터베이스 성능을 최적화하는 데 필수적입니다. 특히 대용량 데이터를 처리하는 테이블의 경우, WHERE 절 및 JOIN 연산에 사용되는 열에 인덱스를 설정하면 검색 효율성을 크게 향상시킬 수 있습니다. 그러나 인덱스가 너무 많으면 삽입 및 업데이트 작업이 느려지므로 적절한 균형을 유지하는 것이 중요합니다.
인덱스를 추가, 확인, 제거 및 평가하는 방법을 이해함으로써 데이터베이스를 보다 쉽게 최적화하고 전체 시스템 효율성을 향상시킬 수 있습니다.


