2010-09-22 16 views
38

Ho bisogno di caricare una tabella con una grande quantità di dati di test. Questo deve essere usato per testare le prestazioni e il ridimensionamento.Riempie le tabelle del database con una grande quantità di dati di test

Come posso creare facilmente 100.000 righe di dati casuali/indesiderati per la tabella del mio database?

+0

Avete i dati di test già o stai andando ad avere per generarlo? – NullUserException

+0

Qual è la struttura della tua tabella? e quale lingua usare? – codaddict

+0

No non ho alcun dato di test, il suo generatore che sto cercando una soluzione. –

risposta

73

È possibile avere questo fatto per voi a GenerateData. Basta specificare i nomi di colonna & tipi di dati e come si desidera che i dati vengano emessi (istruzioni SQL, HTML, Excel, XML, CSV).

alt text

+6

+1. buon collegamento .. – codaddict

+0

Grazie, ma questo e altri software consentono anche solo 100 voci di accesso gratuito ... spendere soldi non è un'opzione per me ora come studente. –

+0

@ Mahammad: quello collegato qui ti consente di generare ** 5000 **. Fallo e copia/incolla/manipola come necessario per raggiungere il tuo obiettivo. –

3

Se si desidera un maggiore controllo sui dati, provare qualcosa di simile (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)); 
} 
?> 

dove generate_test_values ​​funzione dovrebbe restituire una stringa formattata come "('val1', ' val2 ', ...) ". Se questo richiede molto tempo, è possibile in batch in modo che stai non facendo così tante chiamate db, ad es .:

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

avrebbe eseguito solo 10000 query, ognuno dei quali aggiunge 10 righe.

+0

Ritardare un po 'i loop; per evitare che MySQL Server sia andato via - errori, se nel caso li si ottiene. –

+0

Basta notare che questa risposta è piuttosto vecchia. 'mysql_connect()' è deprecato e non è più disponibile in PHP 7. –

52

È inoltre possibile utilizzare uno stored procedure. Si consideri la seguente tabella come esempio:

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

allora si potrebbe aggiungere una stored procedure come questa:

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 ; 

Quando si chiama esso, avrete 100k record:

CALL prepare_data(); 
+0

soluzione molto carina .. stavo pensando di scrivere un ciclo for per esso. –

+0

Sei sicuro che funzionerebbe con MySQL? Non ho mai visto 'WHILE' nelle query MySQL. – stack

+0

è buono, ma abbiamo bisogno di alcuni dati completi medi con alcune più colonne nei dati. –

9

Per clonazione di righe multiple (duplicazione dati) è possibile utilizzare

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

Prova RandomProfile - offrono fino a 100.000 record in uno fa, i dati degli utenti molto realistico, l'esportazione in XML, CSV, testo normale e JSON, così facilmente importati in qualsiasi database.

+0

Man quel sito non riesce a connettersi dopo così tanti tentativi –

1

Qui è una soluzione con la matematica pura e 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

La tua tabella ha solo una singola colonna? Mi piace l'idea di duplicare semplicemente le righe esistenti, ma la tua query potrebbe richiedere un po 'di modifica per utilizzare colonne aggiuntive. Dovresti anche essere in grado di inserire 'NULL' per coprire le colonne' AUTO_INCREMENT'. –

Problemi correlati