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

MySQL에서 임의의 행(Row)을 선택하는 방법 – RAND() 함수 활용법

MySQL에서 테이블에 저장된 데이터 중 무작위(random)로 한 개 이상의 행을 조회하고 싶다면, RAND() 함수와 LIMIT 절을 함께 사용하면 됩니다. 이 방법은 각 행에 임의의 난수를 부여한 뒤 정렬하고, 상위 N개의 행만 가져오는 방식으로 동작합니다.

기본 문법

SELECT * FROM yourTableName ORDER BY RAND() LIMIT 1;

위 쿼리는 지정한 테이블의 모든 행을 무작위 순서로 섞은 후, 그중 첫 번째 행 하나만 반환합니다. LIMIT 값을 조정하면 원하는 개수만큼의 임의 행을 가져올 수도 있습니다.

예제 테이블 생성하기

실제 동작을 확인하기 위해 먼저 예제용 테이블을 생성해 보겠습니다.

mysql> create table generateRandomRow
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> Age int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (1.66 sec)

테이블이 정상적으로 생성되었습니다. 이제 INSERT 명령어로 샘플 데이터를 입력합니다.

샘플 데이터 삽입

mysql> insert into generateRandomRow(Name,Age) values('John',23);
Query OK, 1 row affected (0.22 sec)

mysql> insert into generateRandomRow(Name,Age) values('Larry',21);
Query OK, 1 row affected (0.32 sec)

mysql> insert into generateRandomRow(Name,Age) values('David',21);
Query OK, 1 row affected (0.39 sec)

mysql> insert into generateRandomRow(Name,Age) values('Carol',24);
Query OK, 1 row affected (0.21 sec)

mysql> insert into generateRandomRow(Name,Age) values('Bob',27);
Query OK, 1 row affected (0.14 sec)

mysql> insert into generateRandomRow(Name,Age) values('Mike',29);
Query OK, 1 row affected (0.19 sec)

mysql> insert into generateRandomRow(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.17 sec)

총 7명의 사용자 데이터가 입력되었습니다. SELECT 문으로 전체 데이터를 확인해 보겠습니다.

전체 데이터 조회

mysql> select * from generateRandomRow;

실행 결과는 다음과 같습니다.

+----+-------+------+
| Id | Name  | Age  |
+----+-------+------+
|  1 | John  |   23 |
|  2 | Larry |   21 |
|  3 | David |   21 |
|  4 | Carol |   24 |
|  5 | Bob   |   27 |
|  6 | Mike  |   29 |
|  7 | Sam   |   26 |
+----+-------+------+
7 rows in set (0.00 sec)

RAND()로 임의의 행 선택하기

이제 RAND() 함수를 사용해 테이블에서 무작위로 한 행을 추출해 보겠습니다.

mysql> select * from generateRandomRow order by rand() limit 1;

실행할 때마다 다른 결과가 출력됩니다. 첫 번째 실행 결과는 다음과 같습니다.

+----+------+------+
| Id | Name | Age  |
+----+------+------+
| 5  | Bob  | 27   |
+----+------+------+
1 row in set (0.00 sec)

동일한 쿼리를 다시 실행하면 이번에는 다른 행이 반환되는 것을 확인할 수 있습니다.

mysql> select * from generateRandomRow order by rand() limit 1;

두 번째 실행 결과입니다.

+----+------+------+
| Id | Name | Age  |
+----+------+------+
| 6  | Mike | 29   |
+----+------+------+
1 row in set (0.00 sec)

참고 사항: 성능 최적화

ORDER BY RAND()는 모든 행에 난수를 부여한 후 전체를 정렬하므로, 데이터가 많은 대형 테이블에서는 성능 저하가 발생할 수 있습니다. 레코드 수가 수백만 건 이상인 경우에는 다음과 같은 대안을 고려하는 것이 좋습니다.

  • MAX(Id)와 랜덤 값 조합: FLOOR(1 + RAND() * MAX(Id))를 활용해 임의의 ID를 뽑은 뒤 해당 행만 조회하는 방식으로, 정렬 비용 없이 빠르게 처리할 수 있습니다.
  • 응용 프로그램 단 처리: 전체 ID 목록만 가벼운 쿼리로 가져온 뒤, 애플리케이션 코드에서 무작위 ID를 선택해 해당 행만 다시 조회하는 방법도 효율적입니다.

소규모 테이블이라면 ORDER BY RAND() LIMIT 1 방식이 가장 간단하고 직관적인 해결책이므로 부담 없이 사용해도 됩니다.