Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 WHERE IN vs OR 성능 차이: 인덱스 활용 관점에서 비교하기

MySQL의 IN과 OR, 무엇이 다를까?

MySQL에서 여러 조건으로 데이터를 조회할 때 IN 연산자와 OR 연산자 모두 사용할 수 있습니다. 하지만 중요한 차이점이 하나 있습니다. 바로 IN은 인덱스를 활용할 수 있지만, OR는 인덱스를 활용하지 못하는 경우가 많다는 점입니다. 이로 인해 대량의 데이터를 다룰 때 성능 차이가 크게 벌어질 수 있습니다.

실제 예제를 통해 두 방식의 동작을 직접 확인해 보겠습니다.

1. 테스트 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable711 (
    Id int,
    Name varchar(100)
);
Query OK, 0 rows affected (0.92 sec)

2. 샘플 데이터 입력

INSERT 문을 사용해 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable711 values(100,'Chris');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable711 values(101,'Robert');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable711 values(102,'Carol');
Query OK, 1 row affected (0.35 sec)
mysql> insert into DemoTable711 values(103,'Mike');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable711 values(104,'Sam');
Query OK, 1 row affected (0.15 sec)

3. 전체 데이터 조회

SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from DemoTable711;

실행 결과는 다음과 같습니다.

+------+--------+
| Id   | Name   |
+------+--------+
| 100  | Chris  |
| 101  | Robert |
| 102  | Carol  |
| 103  | Mike   |
| 104  | Sam    |
+------+--------+
5 rows in set (0.00 sec)

4. IN() 연산자로 조회

IN() 메서드를 사용하면 여러 값을 간결하게 조건으로 지정할 수 있습니다.

mysql> select *from DemoTable711 where Id IN(101,103,104);

출력 결과:

+------+--------+
| Id   | Name   |
+------+--------+
| 101  | Robert |
| 103  | Mike   |
| 104  | Sam    |
+------+--------+
3 rows in set (0.03 sec)

5. OR 연산자로 조회

동일한 조건을 OR 연산자로 작성하면 아래와 같습니다.

mysql> select *from DemoTable711 where Id=101 OR Id=103 OR Id=104;

출력 결과:

+------+--------+
| Id   | Name   |
+------+--------+
| 101  | Robert |
| 103  | Mike   |
| 104  | Sam    |
+------+--------+
3 rows in set (0.00 sec)

결론 및 정리

두 쿼리 모두 동일한 결과를 반환하지만, 내부적으로 동작 방식이 다릅니다. MySQL 옵티마이저는 IN 조건을 더 효율적으로 처리하여 인덱스를 활용할 수 있는 반면, OR 조건은 인덱스를 제대로 사용하지 못하고 전체 테이블 스캔(full table scan)으로 이어질 가능성이 높습니다.

따라서 실무에서는 다음과 같이 정리할 수 있습니다.

  • 조건 값이 많다면 IN 사용을 권장: 코드 가독성도 좋아지고, 옵티마이저가 최적화된 실행 계획을 세우기 유리합니다.
  • EXPLAIN으로 확인하는 습관: 복잡한 쿼리라면 EXPLAIN 명령으로 실행 계획을 점검해 인덱스 사용 여부를 반드시 확인하세요.

결과만 같다고 같은 쿼리가 아닙니다. 데이터 양이 늘어날수록 IN과 OR의 성능 격차는 커지므로, 상황에 맞는 연산자 선택이 중요합니다.