MySQL에서 무작위 행 검색하기
MySQL에서 테이블로부터 임의의(랜덤한) 행을 검색하려면 RAND() 함수를 사용하면 됩니다. RAND() 함수는 각 행마다 0 이상 1 미만의 난수를 생성하고, 이 값을 기준으로 정렬하여 무작위 순서의 결과를 얻을 수 있습니다.
무작위 행을 조회하는 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName ORDER BY RAND() LIMIT yourIntegerNumber;
LIMIT에 지정하는 숫자에 따라 한 개 또는 여러 개의 무작위 행을 가져올 수 있습니다.
예제 테이블 생성
문법을 실제로 이해하기 위해 예제 테이블을 먼저 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table gettingRandomRow
-> (
-> CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CustomerName varchar(100)
-> );
Query OK, 0 rows affected (0.45 sec)
샘플 데이터 삽입
INSERT 명령을 사용해 테이블에 여러 개의 레코드를 삽입합니다.
mysql> insert into gettingRandomRow(CustomerName) values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Robert');
Query OK, 1 row affected (0.10 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Ramit');
Query OK, 1 row affected (0.15 sec)
mysql> insert into gettingRandomRow(CustomerName) values('James');
Query OK, 1 row affected (0.11 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Mike');
Query OK, 1 row affected (0.15 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Sam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Carol');
Query OK, 1 row affected (0.11 sec)
mysql> insert into gettingRandomRow(CustomerName) values('David');
Query OK, 1 row affected (0.16 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Maxwell');
Query OK, 1 row affected (0.14 sec)
mysql> insert into gettingRandomRow(CustomerName) values('Larry');
Query OK, 1 row affected (0.13 sec)
mysql> insert into gettingRandomRow(CustomerName) values('John');
Query OK, 1 row affected (0.11 sec)전체 레코드 확인
SELECT 문을 사용해 테이블의 모든 레코드를 조회합니다.
mysql> select *from gettingRandomRow;
실행 결과는 다음과 같습니다. 총 13개의 고객 레코드가 저장되어 있습니다.
+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 1 | Chris |
| 2 | Robert |
| 3 | Ramit |
| 4 | James |
| 5 | Jace |
| 6 | Mike |
| 7 | Sam |
| 8 | Bob |
| 9 | Carol |
| 10 | David |
| 11 | Maxwell |
| 12 | Larry |
| 13 | John |
+------------+--------------+
13 rows in set (0.00 sec)
무작위 행 조회 실행 예제
이제 RAND() 함수를 활용해 무작위 행 한 개 또는 여러 개를 조회하는 쿼리를 살펴보겠습니다.
Case 1: 무작위 행 1개 조회
LIMIT 1을 지정하면 매번 실행할 때마다 서로 다른 행이 무작위로 반환됩니다.
mysql> select *from gettingRandomRow order by rand() LIMIT 1;
실행 결과:
+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 13 | John |
+------------+--------------+
1 row in set (0.00 sec)
Case 2: 무작위 행 2개 조회
LIMIT 2를 지정하면 두 개의 서로 다른 무작위 행이 반환됩니다.
mysql> select *from gettingRandomRow order by rand() LIMIT 2;
실행 결과:
+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 2 | Robert |
| 3 | Ramit |
+------------+--------------+
2 rows in set (0.00 sec)
Case 3: 동일 쿼리 재실행 시 다른 결과
같은 쿼리를 다시 실행하면 매번 다른 조합의 무작위 행이 반환되는 것을 확인할 수 있습니다.
mysql> select *from gettingRandomRow order by rand() LIMIT 2;
실행 결과:
+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
| 4 | James |
| 9 | Carol |
+------------+--------------+
2 rows in set (0.00 sec)
성능 관련 참고 사항
ORDER BY RAND()는 간편하지만, 모든 행에 대해 난수를 계산한 후 정렬해야 하므로 레코드 수가 많은 대용량 테이블에서는 성능 저하가 발생할 수 있습니다. 대용량 테이블에서는 인덱스된 ID 범위 내에서 난수를 생성한 후 해당 행만 조회하는 방식 등을 고려하는 것이 좋습니다. 소규모 테이블이라면 위에서 소개한 RAND() 방식이 가장 간단하고 실용적인 해결책입니다.