2010-09-22 30 views
38

Necesito cargar una tabla con una gran cantidad de datos de prueba. Esto se usará para probar el rendimiento y la escala.Rellenar las tablas de la base de datos con una gran cantidad de datos de prueba

¿Cómo puedo crear fácilmente 100.000 filas de datos aleatorios/basura para la tabla de mi base de datos?

+0

¿Tiene los datos de prueba ya o se va a tener que generarla? – NullUserException

+0

¿Cuál es la estructura de su mesa? y qué idioma usar? – codaddict

+0

No, no tengo ningún dato de prueba, es generarlo que estoy buscando una solución para. –

Respuesta

73

Puede hacer esto por usted en GenerateData. Simplemente especifique los nombres de columnas & tipos de datos y cómo desea que se publiquen los datos (sentencias SQL, HTML, Excel, XML, CSV).

alt text

+6

+1. buen enlace .. – codaddict

+0

Gracias pero este y otros softwares también solo permiten abotu 100 entradas gratis ... gastar dinero no es una opción para mí ahora, ya que soy un estudiante. –

+0

@Mohammad: el enlace aquí le permite gen ** 5000 **. Haga eso y simplemente copie/pegue/manipule según sea necesario para alcanzar su objetivo. –

3

Si desea más control sobre los datos, intentar algo como esto (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)); 
} 
?> 

donde generate_test_values ​​funciones superiores devuelve una cadena con formato como "('val1', ' val2 ', ...) ". Si esto toma mucho tiempo, puede por lotes por lo que está haciendo no tantas llamadas db, por ejemplo .:

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

sólo habría ejecutar consultas 10000, añadiendo cada 10 filas.

+0

Retrasa los bucles un poco; para evitar el servidor MySQL se ha ido - errores, en caso de que los obtenga. –

+0

Solo tenga en cuenta que esta respuesta es bastante antigua. 'mysql_connect()' está en desuso y ya no está disponible en PHP 7. –

52

También podría usar un stored procedure. Considere la siguiente tabla como un ejemplo:

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

Entonces se puede inscribir un procedimiento almacenado de esta manera:

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 ; 

Cuando se llame, tendrá 100k registros:

CALL prepare_data(); 
+0

muy buena solución ... estaba pensando en escribir un bucle para ello. –

+0

¿Estás seguro de que funcionaría para MySQL? Nunca he visto 'WHILE' en consultas MySQL. – stack

+0

es bueno, pero necesitamos algunos datos completos medios con algunas columnas más en los datos. –

9

Para la clonación de múltiples filas (duplicación de datos) puede usar

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

Trate RandomProfile - ofrecen hasta 100.000 registros en un solo hace, los datos de usuario muy realistas, la exportación en XML, CSV, texto plano y json, tan fácilmente importado a cualquier base de datos.

+0

Hombre que el sitio no es capaz de iniciar sesión después de tantos intentos –

1

Aquí es una solución con las matemáticas puras y 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

¿Su tabla solo tiene una sola columna? Me gusta el concepto de solo duplicar filas existentes, pero es posible que su consulta requiera ajustes para usar columnas adicionales. También debería poder insertar 'NULL' para cubrir las columnas' AUTO_INCREMENT'. –

Cuestiones relacionadas