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?
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();
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;
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.
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
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.
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