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

MySQL에서 여러 행을 효율적으로 선택하는 쿼리 작성법

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)