ORDER BY RAND()로 쿼리 결과 무작위 정렬하기
MySQL에서 쿼리 결과를 무작위(랜덤)로 정렬하려면 ORDER BY RAND()를 사용하면 됩니다. 여기에 WHERE 절의 IN 조건과 LIMIT 절을 함께 사용하면, 지정한 값들 중에서 원하는 개수만큼 임의의 행을 손쉽게 추출할 수 있습니다.
기본 구문은 다음과 같습니다.
SELECT * FROM DemoTable1559
WHERE yourColumnName IN(yourValue1, yourValue2, ....N)
ORDER BY RAND()
LIMIT yourLimitValue;
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1559
-> (
-> EmployeeId int,
-> EmployeeName varchar(20),
-> EmployeeAge int
-> );
Query OK, 0 rows affected (1.22 sec)
2. 데이터 삽입
INSERT 명령을 사용하여 직원 정보를 테이블에 입력합니다.
mysql> insert into DemoTable1559 values(101,'Bob',28);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(102,'Robert',26);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1559 values(103,'Sam',25);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(104,'Mike',29);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(105,'John',34);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1559 values(106,'Carol',31);
Query OK, 1 row affected (0.19 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select * from DemoTable1559;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 101 | Bob | 28 |
| 102 | Robert | 26 |
| 103 | Sam | 25 |
| 104 | Mike | 29 |
| 105 | John | 34 |
| 106 | Carol | 31 |
+------------+--------------+-------------+
6 rows in set (0.00 sec)
4. 무작위 정렬 후 임의의 행 선택
다음 쿼리는 EmployeeId가 101, 103, 106인 행 중에서 3개를 무작위 순서로 반환합니다.
mysql> select * from DemoTable1559 where EmployeeId IN(101,103,106) order by rand() limit 3;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 101 | Bob | 28 |
| 103 | Sam | 25 |
| 106 | Carol | 31 |
+------------+--------------+-------------+
3 rows in set (0.00 sec)
쿼리를 실행할 때마다 정렬 순서가 달라지므로, 매번 다른 조합의 행이 반환되는 것을 확인할 수 있습니다.
성능 관련 참고 사항
ORDER BY RAND()는 대상 테이블의 모든 행에 대해 난수를 생성한 뒤 이를 기준으로 정렬하기 때문에, 데이터가 수십만 건 이상인 대용량 테이블에서는 성능이 크게 저하될 수 있습니다. 이런 경우에는 다음과 같은 대안을 고려하는 것이 좋습니다.
- 테이블에 미리 계산된 랜덤 값 컬럼을 추가하고, 해당 컬럼을 기준으로 정렬
- 애플리케이션 단에서 무작위 ID 목록을 생성한 후 IN 조건으로 조회
- AUTO_INCREMENT 키 범위 내에서 임의의 값을 뽑아 조회