So erstellen Sie schnell zig Millionen Testdaten in MySQL

So erstellen Sie schnell zig Millionen Testdaten in MySQL

Bemerkung:

Die Datenmenge in diesem Artikel beträgt 1 Million. Wenn Sie zig Millionen Daten haben möchten, erhöhen Sie einfach die Menge. Verwenden Sie jedoch nicht zu viele rand() oder uuid(), da dies zu Leistungseinbußen führt.

Hintergrund

Wenn wir Leistungstests oder SQL-Optimierungen von Abfragevorgängen durchführen, müssen wir für unsere Tests häufig eine große Menge grundlegender Daten in einer Offline-Umgebung erstellen, um die reale Online-Umgebung zu simulieren.

Unsinn, Sie können mich das nicht online testen lassen, sonst werde ich vom DBA getötet.

So erstellen Sie Testdaten

1. Schreiben Sie Code und fügen Sie Bibliotheken stapelweise über den Code ein (ich habe es verwendet, die Schritte sind zu umständlich, die Leistung ist nicht hoch und es wird nicht empfohlen).

2. Gespeicherte Prozeduren schreiben und Funktionen ausführen (Implementierungsmethode 1 in diesem Artikel)

3. Im temporären Datentabellenmodus ausführen (dieser Artikel implementiert Modus 2, der dringend empfohlen wird. Er ist sehr einfach und das Einfügen der Daten geht schnell. Für 100-W-Daten dauert es nur wenige Sekunden.)

4. Zeile für Zeile manuell einfügen (WTF, geh zur Hölle)

Erstellen der grundlegenden Tabellenstruktur

Unabhängig davon, welche Methode ich verwende, muss ich die Tabelle erstellen, in die ich einfügen möchte.

Tabelle „t_user“ erstellen (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `c_user_id` varchar(36) NICHT NULL STANDARD '',
 `c_name` varchar(22) NICHT NULL STANDARD '',
 `c_province_id` int(11) NICHT NULL,
 `c_city_id` int(11) NICHT NULL,
 `create_time` datetime NICHT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_user_id` (`c_user_id`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;

Methode 1: Verwenden gespeicherter Prozeduren und Speichertabellen

Erstellen einer Speichertabelle

Wir nutzen die schnelle Einfügegeschwindigkeit der MySQL-Speichertabelle, verwenden zunächst Funktionen und gespeicherte Prozeduren, um Daten in der Speichertabelle zu generieren, und fügen sie dann aus der Speichertabelle in die normale Tabelle ein

Tabelle „t_user_memory“ erstellen (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `c_user_id` varchar(36) NICHT NULL STANDARD '',
 `c_name` varchar(22) NICHT NULL STANDARD '',
 `c_province_id` int(11) NICHT NULL,
 `c_city_id` int(11) NICHT NULL,
 `create_time` datetime NICHT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_user_id` (`c_user_id`)
)ENGINE=SPEICHER STANDARD-CHARSET=utf8mb4;

Erstellen von Funktionen und gespeicherten Prozeduren

# Erstellen Sie eine Funktion, die eine zufällige Zeichenfolge und eine zufällige Zeit erstellt mysql> Trennzeichen $$
mysql> CREATE DEFINER=`root`@`%` FUNCTION `randStr`(n INT) RETURNS varchar(255) CHARSET utf8mb4
 -> DETERMINISTISCH
 -> BEGIN
 -> DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
 -> DECLARE return_str varchar(255) DEFAULT '';
 -> DECLARE i INT DEFAULT 0;
 -> WÄHREND ich < n DO
 -> SET return_str = concat(return_str, substring(chars_str, FLOOR(1 + RAND() * 62), 1));
 -> SETZE i = i + 1;
 -> ENDE WÄHREND;
 -> ZURÜCK return_str;
 -> ENDE$$
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> CREATE DEFINER=`root`@`%` FUNCTION `randDataTime`(sd DATETIME,ed DATETIME) GIBT datetime ZURÜCK
 -> DETERMINISTISCH
 -> BEGIN
 -> DECLARE sub INT DEFAULT 0;
 -> DECLARE ret DATETIME;
 -> SET sub = ABS(UNIX_TIMESTAMP(ed)-UNIX_TIMESTAMP(sd));
 -> SET ret = DATE_ADD(sd,INTERVAL FLOOR(1+RAND()*(sub-1)) SECOND);
 -> ZURÜCK ret;
 -> ENDE $$

mysql> Trennzeichen;

# Erstellen Sie eine Prozedur zum Einfügen von Daten in den Datenspeicher mysql> CREATE DEFINER=`root`@`%` PROCEDURE `add_t_user_memory`(IN n int)
 -> BEGIN
 -> DECLARE i INT DEFAULT 1;
 -> WÄHREND (i <= n) TUN
 -> INSERT INTO t_user_memory (c_user_id, c_name, c_province_id, c_city_id, Erstellungszeit) VALUES (uuid(), randStr(20), FLOOR(RAND() * 1000), FLOOR(RAND() * 100), NOW());
 -> SETZE i = i + 1;
 -> ENDE WÄHREND;
 -> ENDE
 -> $$
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

Aufrufen einer gespeicherten Prozedur

mysql> RUFEN SIE add_t_user_memory(1000000) an;
FEHLER 1114 (HY000): Die Tabelle 't_user_memory' ist voll

Wenn der Speicher voll ist, ändern Sie den Parameter max_heap_table_size. Ich habe 64 MB Speicher verwendet und 22 W Daten eingefügt. Ändern Sie ihn je nach Situation, aber der Wert sollte nicht zu groß sein. Der Standardwert von 32 MB oder 64 MB ist in Ordnung. Versuchen Sie es nicht in einer Produktionsumgebung.

Einfügen aus der Speichertabelle in die normale Tabelle

mysql> INSERT INTO t_user SELECT * FROM t_user_memory;
Abfrage OK, 218953 Zeilen betroffen (1,70 Sek.)
Datensätze: 218953 Duplikate: 0 Warnungen: 0

Methode 2: Verwenden einer temporären Tabelle

Erstellen Sie eine temporäre Datentabelle tmp_table

TABELLE ERSTELLEN tmp_table (
	Ich würde INT,
	PRIMÄRSCHLÜSSEL (id)
);

Verwenden Sie Python oder Bash, um eine Datendatei mit 1 Million Datensätzen zu generieren (Python generiert sie sofort).

python (empfohlen): python -c "for i in range(1, 1+1000000): print(i)" > base.txt
bash (nicht empfohlen, langsam): bash i=1; while [ $i -le 1000000 ]; do echo $i; let i+=1; done > base.txt

Daten in die temporäre Tabelle tmp_table importieren

mysql> Daten in Datei „/Users/LJTjintao/temp/base.txt“ laden und in Tabelle tmp_table ersetzen;
Abfrage OK, 1.000.000 Zeilen betroffen (2,55 Sek.)
Datensätze: 1000000 Gelöscht: 0 Übersprungen: 0 Warnungen: 0

In 20 Sekunden können zig Millionen Daten eingefügt werden

Hinweis: Beim Importieren von Daten kann ein Fehler auftreten, da secure_file_priv in MySQL standardmäßig nicht aktiviert ist (dieser Parameter wird verwendet, um die Auswirkungen von Datenimport- und -exportvorgängen, wie z. B. das Ausführen von LOAD DATA-, SELECT ... INTO OUTFILE-Anweisungen und LOAD_FILE()-Funktionen, zu begrenzen. Für diese Vorgänge muss der Benutzer über das FILE-Privileg verfügen.)

Lösung: Fügen Sie secure_file_priv = /Users/LJTjintao/temp/` zur MySQL-Konfigurationsdatei (my.ini oder my.conf) hinzu und starten Sie dann MySQL neu.

Verwenden Sie die temporäre Tabelle als Basisdaten und fügen Sie Daten in t_user ein. Das Einfügen von 1 Million Daten dauert 10,37 Sekunden.

mysql> INSERT INTO t_user
 -> AUSWÄHLEN
 -> Ich würde,
 ->uuid(),
 -> CONCAT('BenutzerSpitzname', id),
 -> FLOOR(Rand() * 1000),
 -> FLOOR(Rand() * 100),
 -> JETZT()
 -> VON
 -> temporäre Tabelle;
Abfrage OK, 1.000.000 Zeilen betroffen (10,37 Sek.)
Datensätze: 1000000 Duplikate: 0 Warnungen: 0

Aktualisieren Sie das Feld „Erstellungszeit“, um die Erstellungszeit der eingefügten Daten zufälliger zu gestalten.

UPDATE t_user SET create_time=date_add(create_time, Intervall FLOOR(1 + (RAND() * 7)) Jahr);

Abfrage OK, 1.000.000 Zeilen betroffen (5,21 Sek.)
Übereinstimmende Zeilen: 1000000 Geändert: 1000000 Warnungen: 0

mysql> UPDATE t_user SET create_time=date_add(create_time, Intervall FLOOR(1 + (RAND() * 7)) Jahr);


Abfrage OK, 1.000.000 Zeilen betroffen (4,77 Sek.)
Übereinstimmende Zeilen: 1000000 Geändert: 1000000 Warnungen: 0
mysql> wähle * ab t_user-Limit 30;
+----+--------------------------------------+----------------+-----------+--------------+---------------------+
| ID | c_Benutzer-ID | c_Name | c_Provinz-ID | c_Stadt-ID | Erstellungszeit |
+----+--------------------------------------+----------------+-----------+--------------+---------------------+
| 1 | bf5e227a-7b84-11e9-9d6e-751d319e85c2 | userNickName1 | 84 | 64 | 13.11.2015 21:13:19 |
| 2 | bf5e26f8-7b84-11e9-9d6e-751d319e85c2 | userNickName2 | 967 | 90 | 13.11.2019 20:19:33 |
| 3 | bf5e2810-7b84-11e9-9d6e-751d319e85c2 | userNickName3 | 623 | 40 | 13.11.2014 20:57:46 |
| 4 | bf5e2888-7b84-11e9-9d6e-751d319e85c2 | userNickName4 | 140 | 49 | 13.11.2016 20:50:11 |
| 5 | bf5e28f6-7b84-11e9-9d6e-751d319e85c2 | userNickName5 | 47 | 75 | 13.11.2016 21:17:38 |
| 6 | bf5e295a-7b84-11e9-9d6e-751d319e85c2 | userNickName6 | 642 | 94 | 13.11.2015 20:57:36 |
| 7 | bf5e29be-7b84-11e9-9d6e-751d319e85c2 | userNickName7 | 780 | 7 | 13.11.2015 20:55:07 |
| 8 | bf5e2a4a-7b84-11e9-9d6e-751d319e85c2 | userNickName8 | 39 | 96 | 13.11.2017 21:42:46 |
| 9 | bf5e2b58-7b84-11e9-9d6e-751d319e85c2 | userNickName9 | 731 | 74 | 13.11.2015 22:48:30 |
| 10 | bf5e2bb2-7b84-11e9-9d6e-751d319e85c2 | userNickName10 | 534 | 43 | 13.11.2016 22:54:10 |
| 11 | bf5e2c16-7b84-11e9-9d6e-751d319e85c2 | userNickName11 | 572 | 55 | 13.11.2018 20:05:19 |
| 12 | bf5e2c70-7b84-11e9-9d6e-751d319e85c2 | userNickName12 | 71 | 68 | 13.11.2014 20:44:04 |
| 13 | bf5e2cca-7b84-11e9-9d6e-751d319e85c2 | userNickName13 | 204 | 97 | 13.11.2019 20:24:23 |
| 14 | bf5e2d2e-7b84-11e9-9d6e-751d319e85c2 | userNickName14 | 249 | 32 | 13.11.2019 22:49:43 |
| 15 | bf5e2d88-7b84-11e9-9d6e-751d319e85c2 | userNickName15 | 900 | 51 | 13.11.2019 20:55:26 |
| 16 | bf5e2dec-7b84-11e9-9d6e-751d319e85c2 | userNickName16 | 854 | 74 | 13.11.2018 22:07:58 |
| 17 | bf5e2e50-7b84-11e9-9d6e-751d319e85c2 | userNickName17 | 136 | 46 | 13.11.2013 21:53:34 |
| 18 | bf5e2eb4-7b84-11e9-9d6e-751d319e85c2 | userNickName18 | 897 | 10 | 13.11.2018 20:03:55 |
| 19 | bf5e2f0e-7b84-11e9-9d6e-751d319e85c2 | userNickName19 | 829 | 83 | 13.11.2013 20:38:54 |
| 20 | bf5e2f68-7b84-11e9-9d6e-751d319e85c2 | userNickName20 | 683 | 91 | 13.11.2019 20:02:42 |
| 21 | bf5e2fcc-7b84-11e9-9d6e-751d319e85c2 | userNickName21 | 511 | 81 | 13.11.2013 21:16:48 |
| 22 | bf5e3026-7b84-11e9-9d6e-751d319e85c2 | userNickName22 | 562 | 35 | 13.11.2019 20:15:52 |
| 23 | bf5e3080-7b84-11e9-9d6e-751d319e85c2 | userNickName23 | 91 | 39 | 13.11.2016 20:28:59 |
| 24 | bf5e30da-7b84-11e9-9d6e-751d319e85c2 | userNickName24 | 677 | 21 | 13.11.2016 21:37:15 |
| 25 | bf5e3134-7b84-11e9-9d6e-751d319e85c2 | userNickName25 | 50 | 60 | 13.11.2018 20:39:20 |
| 26 | bf5e318e-7b84-11e9-9d6e-751d319e85c2 | userNickName26 | 856 | 47 | 13.11.2018 21:24:53 |
| 27 | bf5e31e8-7b84-11e9-9d6e-751d319e85c2 | userNickName27 | 816 | 65 | 13.11.2014 22:06:26 |
| 28 | bf5e324c-7b84-11e9-9d6e-751d319e85c2 | userNickName28 | 806 | 7 | 13.11.2019 20:17:30 |
| 29 | bf5e32a6-7b84-11e9-9d6e-751d319e85c2 | userNickName29 | 973 | 63 | 13.11.2014 21:08:09 |
| 30 | bf5e3300-7b84-11e9-9d6e-751d319e85c2 | userNickName30 | 237 | 29 | 13.11.2018 21:48:17 |
+----+--------------------------------------+----------------+-----------+--------------+---------------------+
30 Zeilen im Satz (0,01 Sek.)

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Optimierung der Abfragegeschwindigkeit von MySQL mit mehreren zehn Millionen Daten mithilfe von Indizes
  • MySQL-Schleife fügt zig Millionen Daten ein
  • So paginieren Sie schnell MySQL-Datenmengen im zweistelligen Millionenbereich
  • Detaillierte Erläuterung mehrerer praktischer Lösungen zum schnellen Löschen großer Datenmengen (zig Millionen) in MySQL
  • Zusammenfassung der Wissenspunkte zur SQL-Abfrageoptimierung für MySQL-Big Data im zweistelligen Millionenbereich
  • MySql schnelles Einfügen von zig Millionen großen Datenbeispielen
  • Detaillierte Erläuterung von 30 SQL-Abfrageoptimierungstechniken für MySQL-Zehnmillionen großer Datenmengen
  • Optimierung der Leistung von Paging-Abfragen für MySQL mit mehreren zehn Millionen Daten
  • So optimieren Sie MySQL Fast Paging für zig Millionen Seiten
  • Detaillierte Erläuterung der MySQL-Datenbank mit zig Millionen Datenabfragen und -speicherungen

<<:  Detaillierte Erklärung zur Verwendung der Linux-lseek-Funktion

>>:  Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit vue3 ein Brick-Breaking-Spiel entwickeln

Artikel empfehlen

Was ist SSH-Portweiterleitung? Was nützt das?

Inhaltsverzeichnis Vorwort 1. Lokale Portweiterle...

Beispielcode zum Konvertieren von Videos mit der ffmpeg-Befehlszeile

Bevor Sie mit dem Haupttext dieses Artikels begin...

Vue implementiert QR-Code-Scanfunktion (mit Stil)

brauchen: Verwenden Sie Vue, um das Scannen von Q...

Sechs mit CSS3 implementierte Randübergangseffekte

Sechs EffekteImplementierungscode html <h1>...

Detaillierte Analyse des React Native-Startvorgangs

Einführung: Dieser Artikel verwendet das von reac...

Implementierungsprozess von row_number in MySQL

1. Hintergrund Im Allgemeinen können wir in einer...

So richten Sie ein Bereitstellungsprojekt unter einem Linux-System ein

1. Ändern Sie die Firewall-Einstellungen und öffn...