Heim >Datenbank >MySQL-Tutorial >So fügen Sie zufällige Zeichenfolgendaten in mysql_MySQL ein
Anwendungsszenarien:
Manchmal ist es notwendig, die in die Datenbank eingefügten Datensätze zu testen, daher sind diese Skripte sehr notwendig.
Tabelle erstellen:
CREATE TABLE `tables_a` ( `id` int(10) NOT NULL DEFAULT '0', `name` char(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Erstellen Sie eine Funktion, die eine zufällige Zeichenfolge generiert:
set global log_bin_trust_function_creators = 1; DROP FUNCTION IF EXISTS rand_string; DELIMITER // CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END // delimiter ;
Erstellen Sie die Prozedur zum Einfügen der Tabelle, bei der x beginnt. y ist der Endwert, z ist die Anzahl der generierten Zufallszahlen
delimiter // create procedure test(x int(10),y int(10),z int(10)) begin DECLARE i INT DEFAULT x; while i<y do insert into tables_a values(i,rand_string(z)); set i=i+1; end whi
MySQL-Zufallsdatengenerierung und -einfügung
In der dblp-Datenbank gibt es nur sehr wenige Zitationsinformationen, mit durchschnittlich 0,2 Zitaten pro Artikel. In einem Artikel, in dem dblp als experimenteller Datensatz verwendet wurde, wurde erwähnt, dass Zitatinformationen zufällig hinzugefügt werden können. Davon inspiriert, plante ich, zu jedem Artikel 20 zufällige Zitate hinzuzufügen, also schrieb ich die folgende SQL-Anweisung:
String sql = "insert into citation(pId1,pId2) Values( (select pId from papers limit ?,1),(select pId from papers limit ?,1))";
Verwenden Sie die vorbereitete Anweisung, um die Datenbank im Batch-Modus zu übermitteln.
Der erste Parameter sind die Zeileninformationen des Papiers im Bereich von 0 bis N (N ist die gesamte Zeile der Papiere). Der zweite Parameter besteht aus 20 sich nicht wiederholenden, von Java generierten Zufallszahlen im Bereich von 0 bis N. Dann werden alle 10.000 Daten in einer for-Schleife verschachtelt an die Datenbank übermittelt.
Dieser Code nutzt geschickt die Limit-Funktion, um Tupel zufällig auszuwählen, was insgeheim zufriedenstellend ist. Ich dachte, dass alle Auswahlen von der Datenbank durchgeführt werden, sodass keine mehreren Verbindungen über JDBC erforderlich sind und dass die Auswahl schnell abgeschlossen werden kann. Unerwarteterweise dauerte das Einfügen von nur 100.000 Daten (10000*10) bis zu 22 Minuten. Für das letzte Experiment müssen 4 Millionen Daten eingegeben werden, was bedeutet, dass es etwa 14 Stunden dauern wird.
Also begann ich darüber nachzudenken und schrieb weiterhin ähnliche Programme, um den Zeitengpass zu finden, und sperrte schließlich das Auswahllimit ein. Dieser Vorgang ist äußerst zeitaufwändig. Der Grund für die Auswahl von „Limit“ am Anfang liegt darin, dass Zahlen zufällig generiert werden und die Zahlen Tupeln, also Zeilen-IDs, zugeordnet werden müssen. Da der Primärschlüssel der Papiertabelle kein inkrementierender int ist, existiert die Standard-Zeilen-ID nicht . Später dachte ich, ich könnte der Papiertabelle eine temporäre Spalte von auto_increment hinzufügen und sie dann löschen, nachdem ich das Einfügen des Zitats abgeschlossen habe. Auf diese Weise wird die SQL-Anweisung geändert in:
String sql = "insert into citation(pId1,pId2) Values((select pId from papers where temp=?), (select pId from papers where temp=?))";
Fügen Sie erneut 100.000 Daten ein, was 38 Sekunden dauert. Die Effizienz wurde stark verbessert, aber ich weiß nicht, ob sie noch weiter optimiert werden kann.