본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 인덱스 성능 검증

by Lpromotion 2024. 12. 31.

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 = ?)가 빈번하다면, 관련 컬럼에 인덱스를 추가하는 것이 성능 최적화에 유리하다.
  • 인덱스가 없는 경우, 테이블 크기가 커질수록 성능 저하가 심화된다.

 

반응형

댓글