1. 실행 계획 확인
인덱스가 사용되고 있는지 확인하려면 데이터베이스에서 실행 계획을 조회할 수 있다.
예를 들어, MySQL에서는 아래 명령어를 사용한다.
EXPLAIN
SELECT * FROM user_interactions WHERE user_id = 1;
결과에서 key 열에 idx_user_id가 표시되면 인덱스가 사용되고 있는 것이다.
mysql> EXPLAIN SELECT * FROM user_interactions WHERE user_id = 9;
+----+-------------+-------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user_interactions | NULL | ref | idx_user_id | idx_user_id | 8 | const | 5 | 100.00 | NULL |
+----+-------------+-------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.04 sec)
- key 열에 idx_user_id가 표시되었으므로 인덱스가 사용되고 있는 것이다.
- type이 ref로 표시된 것은 인덱스를 사용하여 조건과 일치하는 데이터를 빠르게 검색했음을 의미한다.
- 최종적으로 이 쿼리는 인덱스를 사용하여 효율적으로 동작하고 있다.
2. 인덱스 존재 여부에 따른 성능 테스트
user_id 컬럼에 인덱스가 있을 때와 없을 때의 성능 차이를 확인하기 위한 테스트.
1. 기존 테이블 복제
CREATE TABLE ... AS SELECT
구문을 사용하여 기존 user_interactions 테이블을 복제했다.- 복제 시 데이터는 복사되지만, 인덱스와 제약 조건은 복사되지 않는다.
CREATE TABLE user_interactions_test AS SELECT * FROM user_interactions;
2. 인덱스 없을 때 실행 계획 확인
EXPLAIN
명령어를 사용하여 user_id가 있는 행을 조회하는 쿼리의 실행 계획을 확인한다.- 인덱스가 없는 경우, 테이블 전체를 순차적으로 스캔(ALL)하는 결과가 나온다.
EXPLAIN SELECT * FROM user_interactions_test WHERE user_id = 9;
mysql> EXPLAIN SELECT * FROM user_interactions_test WHERE user_id = 9;
+----+-------------+------------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user_interactions_test | NULL | ALL | NULL | NULL | NULL | NULL | 370 | 10.00 | Using where |
+----+-------------+------------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.05 sec)
3. 인덱스 추가 후 실행 계획 확인
- user_id 컬럼에 인덱스를 추가한 후, 동일한 쿼리를 실행하여 실행 계획을 확인한다.
- 인덱스가 있는 경우, 인덱스를 사용(ref)하여 효율적으로 데이터를 검색하는 결과가 나온다.
ALTER TABLE user_interactions_test ADD INDEX idx_user_id (user_id);
EXPLAIN SELECT * FROM user_interactions_test WHERE user_id = 9;
mysql> ALTER TABLE user_interactions_test ADD INDEX idx_user_id (user_id);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> EXPLAIN SELECT * FROM user_interactions_test WHERE user_id = 9;
+----+-------------+------------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user_interactions_test | NULL | ref | idx_user_id | idx_user_id | 8 | const | 5 | 100.00 | NULL |
+----+-------------+------------------------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)
4. 테스트 결과
상태 | 실행 계획 (type) | 사용된 인덱스 (key) | 검색 방식 | |
인덱스 없음 | ALL | NULL | 전체 테이블 스캔 | rows가 테이블 전체 크기(370)로 표시됨 |
인덱스 있음 | ref | idx_user_id | 조건에 맞는 행만 검색 | rows가 조건에 맞는 데이터 수(5)로 표시됨 |
- user_id 컬럼에 인덱스가 없을 경우, 테이블의 모든 행을 스캔(ALL)해야 하므로 성능이 저하된다.
- 인덱스를 추가하면 ref 방식으로 검색이 이루어지고, 조건에 맞는 데이터만 빠르게 조회할 수 있다.
- 실행 계획에서 key가 idx_user_id로 표시되며, 인덱스가 효과적으로 사용되고 있음을 확인할 수 있다.
- 조건 기반 쿼리(
WHERE user_id = ?
)가 빈번하다면, 관련 컬럼에 인덱스를 추가하는 것이 성능 최적화에 유리하다. - 인덱스가 없는 경우, 테이블 크기가 커질수록 성능 저하가 심화된다.
반응형
'Projects > 청하-청년을 위한 커뮤니티 서비스' 카테고리의 다른 글
[청하] 정책 필터링 조회 기능 - LazyInitializationException 해결 (feat. 트랜잭션 범위 확장과 프록시 컬렉션 복사) (0) | 2025.02.02 |
---|---|
[청하] 맞춤 & 핫한 정책 조회 기능 - MySQL의 ONLY_FULL_GROUP_BY 오류 해결 (0) | 2025.01.01 |
[청하] AI 사서 프롬프트 엔지니어링 (0) | 2024.12.31 |
[청하] 맞춤 정책 리스트 조회 기능 구현 (0) | 2024.12.31 |
[청하] 홈화면 리뉴얼: 맞춤 정책, 핫한 정책, 커뮤니티 미리보기 설계 (0) | 2024.10.27 |
댓글