2014-01-14 2 views
6

Wie erstellen Sie am schnellsten 899 Zeilen in einer Tabelle, indem Sie nur die Nummer verwenden. Die Spalte wird nicht automatisch inkrementiert.Fügen Sie viele Zeilen mit nur einer Nummer ein

Derzeit erstelle ich eine Abfrage wie folgt:

$a1=range(100,999); 
$a1=implode('),(',$a1); 
$a1='INSERT INTO groups (val) VALUES('.$a1.')'; 

es eine riesige Abfrage wie folgt gibt:

INSERT INTO groups (val) VALUES(100),(101),(102),(103),(104),(105),(106),(107),(108), 
(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122), 
(123),(124),(125), etc etc etc.... 

Ich frage mich, ob es ein schneller und schöner Weg, dies zu tun?

+2

Ich würde empfehlen, gespeicherte Prozeduren für diese Art von Aufgabe zu verwenden. – opalenzuela

+1

Siehe die * Nummer Tabelle * Generator @ http://stackoverflow.com/questions/9751318/creating-a-numbers-table-in-mysql –

+8

Ich glaube nicht, dass diese Frage eine Down-Vote verdient. Das OP zeigte, was bisher versucht wurde (was funktioniert), und stellte eine gezielte Frage. Ich weiß, dass das Code-Snippet unvollständig ist (und die Programmiersprache nicht erwähnt), aber die Frage ist klar. –

Antwort

1

Ich glaube nicht, dass Sie einen schnelleren Weg haben, dies zu tun. Schauen Sie sich MySQL documentation

Die erforderliche Zeit zum Einfügen einer Zeile durch die folgenden Faktoren bestimmt, wobei die Zahlen ungefähren Anteilen an:

anschließen: (3)

Senden Abfrage an den Server : (2)

Parsing-Abfrage: (2)

Inse rting Reihe: (1 × Größe der Reihe)

Einfügen von Indizes: (1 x Anzahl der Indizes)

Schliessung: (1)

Dies dauert nicht berücksichtigt den anfänglichen Aufwand Tabellen öffnen , was einmal für jede gleichzeitig ablaufende Abfrage durchgeführt wird.

Die Größe der Tabelle verlangsamt die Einfügung von Indizes durch log N, unter Annahme von B-Tree-Indizes.

können Sie die folgenden Methoden verwenden Einsätze zu beschleunigen:

Wenn Sie viele Zeilen vom selben Client zur gleichen Zeit einfügen, Verwendung INSERT-Anweisungen mit mehreren Werten listen mehrere Reihen auf einem einfügen Zeit. Dies ist wesentlich schneller (viele Male schneller in einigen Fällen ) als die Verwendung einzelner INSERT-Anweisungen für eine Zeile. Wenn Sie Daten zu einer nicht leeren Tabelle hinzufügen, können Sie die Variable bulk_insert_buffer_size optimieren, um das Einfügen von Daten noch schneller zu machen. Siehe Abschnitt 5.1.4, "Server Systemvariablen".

Mit einer Abfrage speichern Sie die Connecting, Sending query to server, Closing sowie MySQL die Optimierung Ihrer Abfrage.

Wenn Sie nur etwa 1000 Zeilen mit so wenig Daten einfügen, ist die Einfügung sehr schnell, so dass ich in diesem Fall keine Sorgen über die Leistung machen würde.

+0

Danke. Ich bleibe bei dieser großen Frage :-) – Michel

0

Für eine Reihe von Zahlen eine kleine Abfrage verwendet werden kann, wenn Sie wollen: -

INSERT INTO groups (val) 
SELECT Hundreds.a * 100 + Tens.a * 10 + Units.a AS aNumber 
FROM 
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Hundreds, 
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Tens, 
(SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Units 
HAVING aNumber BETWEEN 100 AND 999 

nicht sicher, dies erspart Sie etwas obwohl viel.

Verwandte Themen