MySQL에서 여러 개의 값을 한 번에 빠르게 조회하려면 IN() 연산자를 사용하는 것이 가장 효율적입니다. 루프를 돌며 개별 쿼리를 반복 실행하거나 OR 연산자를 여러 번 나열하는 방식은 쿼리 파싱 비용과 네트워크 오버헤드가 커져 성능이 크게 저하됩니다. 반면 IN()은 하나의 쿼리로 여러 조건을 처리할 수 있어 훨씬 빠른 결과를 얻을 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1538
-> (
-> ClientId int,
-> ClientName varchar(20)
-> );
Query OK, 0 rows affected (0.59 sec)
2. 데이터 삽입
insert 명령어를 사용해 테이블에 샘플 레코드를 추가합니다.
mysql> insert into DemoTable1538 values(101,'Chris');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1538 values(102,'Robert');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1538 values(103,'Bob');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1538 values(104,'Adam');
Query OK, 1 row affected (0.16 sec)
3. 전체 데이터 확인
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1538;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 101 | Chris |
| 102 | Robert |
| 103 | Bob |
| 104 | Adam |
+----------+------------+
4 rows in set (0.00 sec)
4. IN()으로 여러 값 한 번에 조회하기
이제 IN() 연산자를 사용해 ClientId가 101, 103, 104인 레코드를 단일 쿼리로 조회해 보겠습니다.
mysql> select * from DemoTable1538 where ClientId IN(101,103,104);
실행 결과는 다음과 같습니다.
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 101 | Chris |
| 103 | Bob |
| 104 | Adam |
+----------+------------+
3 rows in set (0.00 sec)
IN()이 더 빠른 이유
IN() 연산자가 루프나 OR 연산자보다 성능이 좋은 이유는 다음과 같습니다.
- 네트워크 왕복 감소: 루프로 개별 쿼리를 실행하면 요청마다 데이터베이스와 통신해야 하지만, IN()은 단 한 번의 통신으로 처리됩니다.
- 옵티마이저 최적화: MySQL 옵티마이저는 IN 목록을 분석해 효율적인 실행 계획을 수립합니다.
- 인덱스 활용: 조회 대상 컬럼에 인덱스가 있다면 IN() 조건에서도 인덱스를 활용해 검색 속도를 크게 높일 수 있습니다.
결론적으로, 여러 값을 조건으로 조회할 때는 루프나 긴 OR 체인 대신 IN()을 사용하는 것이 코드 가독성과 쿼리 성능 모두에서 훨씬 유리합니다.