web-dev-qa-db-fra.com

Remplir les tables de la base de données avec une grande quantité de données de test

Je dois charger une table avec une grande quantité de données de test. Ceci doit être utilisé pour tester les performances et la mise à l'échelle.

Comment créer facilement 100 000 lignes de données aléatoires/indésirables pour ma table de base de données?

49
Mohammad Umair

Vous pouvez également utiliser une procédure stockée . Considérez le tableau suivant comme exemple:

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

Ensuite, vous pouvez ajouter une procédure stockée comme ceci:

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 ;

Lorsque vous l'appelez, vous aurez 100 000 enregistrements:

CALL prepare_data();
67
Daniel Vassallo

Pour le clonage de plusieurs lignes (duplication de données), vous pouvez utiliser

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;
12
michalzuber

Si vous voulez plus de contrôle sur les données, essayez quelque chose comme ceci (en 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));
}
?>

où function generate_test_values ​​retournera une chaîne au format "('val1', 'val2', ...)" Si cela prend beaucoup de temps, vous pouvez les grouper afin que vous ne fassiez pas autant d'appels de base de données, par exemple

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

lancerait seulement 10000 requêtes, chacune ajoutant 10 lignes.

4
gmarcotte

Voici la solution avec les mathématiques pures et 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
4
Daneel S. Yaitskov

essayez filldb

vous pouvez publier votre schéma ou utiliser un schéma existant et générer des données factices, puis exporter à partir de ce site et les importer dans votre base de données.

0
ganesh konathala

J'ai créé un script Ruby capable d'insérer dans pratiquement "toute" base de données ne comportant pas de validation de clé étrangère entre les tables, et d'insérer des données aléatoires. Vous pouvez donc comparer la base de données à certaines données . I '. Je créerai un bijou plus tard (quand j’aurai du temps libre) à partir de ce Gist -> https://Gist.github.com/carlosveucv/137ea32892ef96ab496def5fcd21858b

0
carlosveucv