2012-06-12 25 views
5

Ich muss in die MySQL-Datenbank eine Menge Daten für etwa 5 mal pro Sekunde schreiben. Was ist der schnellste Weg: Fügen Sie jede 1/5 Sekunde ein oder erstellen Sie eine Warteschlange und fügen Sie alle gespeicherten Daten alle ~ 5 Sekunden ein? Wenn der zweite Weg besser ist - ist es möglich, in 1 Tabelle mit 1 Anfrage ein paar Zeilen einzufügen?Einfügen in die Datenbank

Antwort

2

In Anbetracht der Häufigkeit der Einfügungen Seine besser zu gehen Sie mit dem zweiten Ansatz, der in der Warteschlange ist und dann auf einmal hinzufügen.!

Aber Sie sollten diese Szenarien betrachten zuerst:

  1. Ist Ihr System Echtzeit.? Ja, dann, was ist die maximale Verzögerung, die Sie sich leisten können (wie es dauert ~ 5 Sekunden für die nächste Insertion und Daten werden beibehalten/verfügbar)?

  2. Wie sind die Chancen, dass falsche Werte/Fehler in Daten kommen, als ob eine Daten falsch ist, verlieren Sie alle Ruhe, wenn die Abfrage fehlschlagen muss.

+0

Ja, das System ist in Echtzeit. Die Daten sind eine einfache Base64 mit ~ 100 Datenbytes. – Ockonal

+2

Wenn ja, würde ich mit Single-Insertion und mit Connection Pooling auf DAO-Ebene gehen. Da Sie es sich nicht leisten können, Daten in RTS zu verlieren, ist auch die Zeit entscheidend. Hoffe das hat dir geholfen. :) –

+0

Danke für die Hilfe;) – Ockonal

2

Verwenden mehrerer Pufferpools mit innodb_buffer_pool_instances. es kann von der Anzahl der Kerne auf der Maschine abhängen. Verwenden Sie Partitioning der Tabelle.
Sie können Daten gemeinsam mit XML einfügen.

1

Sie einen Einsatz mit allen Daten witho so etwas wie dies machen:

INSERT INTO table (field1, field2,... , fieldN) 
VALUES 
(value1_1', value1_2,... , value1_N), 
(value2_1', value2_2,... , value2_N), 
... 
(valueM_1', valueM_2,... , valueM_N); 
2

Da jede Transaktion mit einem festen Kosten kommt, würde ich sagen, dass ein mehrzeiliges alle paar Sekunden einfügen zu tun ist besser . Bei einigen der Systeme, die wir bei der Arbeit verwenden, werden Hunderte von Zeilen zwischengespeichert, bevor sie alle auf einmal eingefügt werden.

Von der MySQL documentation Sie können ein tun mehrzeiligen wie so ein:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 
1

Meine Erfahrung ist, dass, wenn Daten in einer MySQL-Datenbank einfügen es schneller ist mit Chargen zu arbeiten.

So ist die langsamer Option ausführt, mehrere Insert-Abfragen:

 

    INSERT INTO my_table VALUES (1, "a"); 
    INSERT INTO my_table VALUES (2, "b"); 

Die schneller Option wäre:

 

    INSERT INTO my_table VALUES (1, "a"), (2, "b");