programing

데이터베이스 테이블을 대량의 테스트 데이터로 채우다

procenter 2022. 12. 29. 21:30
반응형

데이터베이스 테이블을 대량의 테스트 데이터로 채우다

대량의 테스트 데이터가 있는 테이블을 로드해야 합니다.이는 성능 테스트 및 확장에 사용됩니다.

데이터베이스 테이블에 100,000행의 랜덤/정크 데이터를 쉽게 작성하려면 어떻게 해야 합니까?

저장 프로시저를 사용할 수도 있습니다.다음 표를 예로 들어 보겠습니다.

CREATE TABLE your_table (id int NOT NULL PRIMARY KEY AUTO_INCREMENT, val int);

그런 다음 다음과 같은 저장 프로시저를 추가할 수 있습니다.

DELIMITER $$
CREATE PROCEDURE prepare_data()
BEGIN
  DECLARE i INT DEFAULT 100;

  WHILE i < 100000 DO
    INSERT INTO your_table (val) VALUES (i);
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;

전화를 걸면 10만 개의 레코드가 남습니다.

CALL prepare_data();

다중 행 복제(데이터 복제)의 경우

DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
  DECLARE i INT DEFAULT 1;

  WHILE i < 100000 DO
    INSERT INTO `table` (`user_id`, `page_id`, `name`, `description`, `created`)
    SELECT `user_id`, `page_id`, `name`, `description`, `created`
    FROM `table`
    WHERE id = 1;
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;
CALL insert_test_data();
DROP PROCEDURE insert_test_data;

다음은 순수 수학과 SQL을 사용한 솔루션입니다.

create table t1(x int primary key auto_increment);
insert into t1 () values (),(),();

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 1265 rows affected (0.01 sec)
Records: 1265  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 2530 rows affected (0.02 sec)
Records: 2530  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 5060 rows affected (0.03 sec)
Records: 5060  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 10120 rows affected (0.05 sec)
Records: 10120  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 20240 rows affected (0.12 sec)
Records: 20240  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 40480 rows affected (0.17 sec)
Records: 40480  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 80960 rows affected (0.31 sec)
Records: 80960  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 161920 rows affected (0.57 sec)
Records: 161920  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 323840 rows affected (1.13 sec)
Records: 323840  Duplicates: 0  Warnings: 0

mysql> insert into t1 (x) select x + (select count(*) from t1) from t1;
Query OK, 647680 rows affected (2.33 sec)
Records: 647680  Duplicates: 0  Warnings: 0

데이터를 더 제어하고 싶다면 다음과 같은 방법을 사용해 보십시오(PHP).

<?php
$conn = mysql_connect(...);
$num = 100000;

$sql = 'INSERT INTO `table` (`col1`, `col2`, ...) VALUES ';
for ($i = 0; $i < $num; $i++) {
  mysql_query($sql . generate_test_values($i));
}
?>

여기서 generate_test_values 함수는 ('val1', 'val2', ...'와 같은 형식의 문자열을 반환합니다.이 작업에 시간이 오래 걸리는 경우 DB 호출을 너무 많이 하지 않도록 배치 할 수 있습니다.예를 들어 다음과 같습니다.

for ($i = 0; $i < $num; $i += 10) {
  $values = array();
  for ($j = 0; $j < 10; $j++) {
    $values[] = generate_test_data($i + $j);
  }
  mysql_query($sql . join(", ", $values));
}

는 10000개의 쿼리만 실행하고 각 쿼리는 10개의 행을 추가합니다.

filldb를 시도하다

스키마를 게시하거나 기존 스키마를 사용하여 더미 데이터를 생성하고 이 사이트에서 내보낸 후 데이터베이스로 가져올 수 있습니다.

Percona의 mysql_random_data_loader 유틸리티가 매우 마음에 듭니다.자세한 내용은 이쪽에서 확인하실 수 있습니다.

mysql_sysql_data_sysql은 mysql 데이터베이스에 접속하여 지정된 테이블을 랜덤 데이터로 채우는 유틸리티입니다.테이블에 외부 키가 있는 경우 외부 키도 올바르게 입력됩니다.

이 유틸리티는 쿨 기능을 갖추고 있어 데이터 생성 속도를 제한할 수 있습니다.

예를 들어, 30,000개의 레코드를 사킬라에서 생성합니다.초당 500 레코드 속도의 film_actor 테이블, 다음 명령어가 필요합니다.

mysql_random_data_load sakila film_actor 30000 --host=127.0.0.1 --port=3306 --user=my_user --password=my_password --qps=500 --bulk-size=1

이 툴을 사용하여 테스트 환경에서 워크로드를 시뮬레이트할 수 있었습니다.이 유틸리티를 여러 스레드에서 테이블마다 다른 속도로 실행하고 있습니다.

create table mydata as select * from information_schema.columns;
insert into mydata select * from mydata;
-- repeating the insert 11 times will give you at least 6 mln rows in the table.

만약 이것이 적절하지 않다면 대단히 죄송합니다만, 저는 이 코드에 대해 설명할 수 있을 정도로만 알고 있고, 위의 답변이 어떻게 기능하는지만 이해한다면 도움이 될 것이라고 생각합니다.

줄 - '아까보다'라는 표를 만듭니다.mydata 수 있습니다.information_schema에 대한 경우 MYSQL 서버 는 "MYSQL" 에서 .「MYSQL」information_schema.columns테이블 작성에 필요한 모든 컬럼 정보를 테이블 작성뿐만 아니라 필요한 모든 컬럼을 자동으로 매우 편리하게 사용할 수 있습니다.

두 번째 행은 다음 행으로 시작합니다.Insert새로운 테이블이 호출된 것을 목표로 하는 스테이트먼트mydata를 삽입합니다.Information_schema데이터를 테이블에 넣습니다.마지막 행은 추가 데이터를 생성할 경우 스크립트를 여러 번 실행하라는 코멘트입니다.

마지막으로 테스트에서 이 스크립트를 한 번 실행하면 6,956행의 데이터가 생성되었습니다.레코드를 빠르게 생성할 수 있는 방법이 필요한 경우 이 방법도 나쁘지 않습니다.다만, 보다 고도의 테스트에서는,ALTER프라이머리 키가 없는 데이터베이스로 고유 인덱스를 갖도록 자동으로 증가하는 프라이머리 키를 포함하는 테이블은 sad 데이터베이스입니다.또한 중복된 엔트리가 있을 수 있기 때문에 예측할 수 없는 결과를 초래하는 경향이 있습니다.어쨌든, 이 코드에 대한 이해를 제공하고 싶었습니다.왜냐하면 이 코드가 유용하다고 생각했기 때문입니다.다른 사람들도 시간을 들여서 설명을 해 주었으면 좋았을 거라고 생각합니다.대부분의 사람들은 코드 실행의 팬이 아니기 때문에 신뢰할 수 있는 소스로부터조차 코드 실행이 어떻게 될지 알 수 없기 때문에 다른 누군가가 이 코드를 유용하게 사용할 수 있기를 바랍니다."답변"으로서가 아니라 위의 답변에 대한 물류 지원을 제공하기 위한 또 다른 정보원으로서 제공하는 것입니다.

이것은 @michalzuber answer에 대한 보다 뛰어난 수정입니다.유일하게 다른 점은 이 기능을 제거한다는 것입니다.WHERE id = 1각 실행 시 삽입물이 누적될 수 있습니다.

생성되는 기록의 양은 n^2가 될 것이다.

따라서 10회 반복에 대해 10^2 = 1024개 레코드 20회 반복에 대해 20^2 = 1048576 레코드 등입니다.

DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
  DECLARE i INT DEFAULT 1;

  WHILE i <= 10 DO
    INSERT INTO `table` (`user_id`, `page_id`, `name`, `description`, `created`)
    SELECT `user_id`, `page_id`, `name`, `description`, `created`
    FROM `table`;
    SET i = i + 1;
  END WHILE;
END$$
DELIMITER ;
CALL insert_test_data();
DROP PROCEDURE insert_test_data;

언급URL : https://stackoverflow.com/questions/3766282/fill-database-tables-with-a-large-amount-of-test-data

반응형