MySQL에서 대량의 데이터를 다룰 때 특정 조건에 맞는 여러 행을 빠르게 조회하려면 인덱스(Index)를 활용하는 것이 핵심입니다. 인덱스가 없으면 전체 테이블을 스캔해야 하지만, 인덱스를 사용하면 원하는 행만 정확하고 신속하게 찾아낼 수 있습니다.
이 글에서는 예제 테이블을 만들고 인덱스를 적용한 뒤, IN 연산자를 사용해 여러 행을 효율적으로 선택하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1501
-> (
-> Id int NOT NULL PRIMARY KEY,
-> URL text
-> );
Query OK, 0 rows affected (0.62 sec)2. 인덱스 생성
다음은 Id 컬럼에 인덱스를 생성하는 쿼리입니다. 기본 키(Primary Key)에는 이미 자동으로 인덱스가 생성되지만, 명시적으로 인덱스를 추가하면 조회 최적화 의도를 분명하게 드러낼 수 있습니다.
mysql> create index id_index on DemoTable1501(Id); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0
3. 데이터 삽입
INSERT 명령을 사용해 테이블에 샘플 레코드를 넣어 보겠습니다.
mysql> insert into DemoTable1501 values(101,'www.facebook.com'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable1501 values(110,'www.google.com'); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable1501 values(220,'www.gmail.com'); Query OK, 1 row affected (0.06 sec) mysql> insert into DemoTable1501 values(350,'www.youtube.com'); Query OK, 1 row affected (0.08 sec)
4. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1501;
실행 결과는 다음과 같습니다.
+-----+------------------+ | Id | URL | +-----+------------------+ | 101 | www.facebook.com | | 110 | www.google.com | | 220 | www.gmail.com | | 350 | www.youtube.com | +-----+------------------+ 4 rows in set (0.00 sec)
5. IN 연산자로 여러 행 효율적으로 조회하기
여러 개의 특정 행을 한 번에 가져올 때는 WHERE ... IN (...) 구문을 사용하는 것이 가장 효율적입니다. 아래 쿼리는 Id가 101, 220, 350인 세 개의 행만 선택합니다.
mysql> select * from DemoTable1501
-> where Id in(101,220,350);실행 결과는 다음과 같습니다.
+-----+------------------+ | Id | URL | +-----+------------------+ | 101 | www.facebook.com | | 220 | www.gmail.com | | 350 | www.youtube.com | +-----+------------------+ 3 rows in set (0.00 sec)
6. 인덱스 활용 여부 확인하기
이 쿼리가 실제로 인덱스를 통해 실행되었는지 확인하려면 SHOW STATUS 명령으로 핸들러 상태 변수를 살펴볼 수 있습니다. Handler_read_key 값이 3으로 표시되는데, 이는 4개의 Id 중 요청한 3개의 값이 각각 인덱스 키를 통해 읽혔다는 것을 의미합니다. 즉, 불필요한 전체 스캔 없이 필요한 행만 인덱스 기반으로 조회된 것입니다.
mysql> SHOW STATUS LIKE 'Handler_%';
실행 결과는 다음과 같습니다.
+----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_commit | 1 | | Handler_delete | 0 | | Handler_discover | 0 | | Handler_external_lock | 2 | | Handler_mrr_init | 0 | | Handler_prepare | 0 | | Handler_read_first | 0 | | Handler_read_key | 3 | | Handler_read_last | 0 | | Handler_read_next | 0 | | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 0 | | Handler_rollback | 0 | | Handler_savepoint | 0 | | Handler_savepoint_rollback | 0 | | Handler_update | 0 | | Handler_write | 0 | +----------------------------+-------+ 18 rows in set (0.00 sec)