Fill database tables with a large amount of test data

后端 未结 7 1391
长发绾君心
长发绾君心 2020-12-07 09:18

I need to load a table with a large amount of test data. This is to be used for testing performance and scaling.

How can I easily create 100,000 rows of random/junk

相关标签:
7条回答
  • 2020-12-07 09:49

    If you want more control over the data, try something like this (in 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));
    }
    ?>
    

    where function generate_test_values would return a string formatted like "('val1', 'val2', ...)". If this takes a long time, you can batch them so you're not making so many db calls, e.g.:

    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));
    }
    

    would only run 10000 queries, each adding 10 rows.

    0 讨论(0)
  • 2020-12-07 09:50

    You could also use a stored procedure. Consider the following table as an example:

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

    Then you could add a stored procedure like this:

    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 ;
    

    When you call it, you'll have 100k records:

    CALL prepare_data();
    
    0 讨论(0)
  • 2020-12-07 09:50

    I really like the mysql_random_data_loader utility from Percona, you can find more details about it here.

    mysql_random_data_loader is a utility that connects to the mysql database and fills the specified table with random data. If foreign keys are present in the table, they will also be correctly filled.

    This utility has a cool feature, the speed of data generation can be limited.

    For example, to generate 30,000 records, in the sakila.film_actor table with a speed of 500 records per second, you need the following command

    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
    

    I have successfully used this tool to simulate a workload in a test environment by running this utility on multiple threads at different speeds for different tables.

    0 讨论(0)
  • 2020-12-07 09:53

    Here it's solution with pure math and 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
    
    0 讨论(0)
  • 2020-12-07 09:59

    For multiple row cloning (data duplication) you could use

    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;
    
    0 讨论(0)
  • 2020-12-07 10:03

    try filldb

    you can either post your schema or use existing schema and generate dummy data and export from this site and import in your data base.

    0 讨论(0)
提交回复
热议问题