2017-04-14 4 views
2

Die Tabelle ist zunächst leer.
Wenn ich die Transaktion nach 20000 Zeile commit, kostet es weniger als 1 Sekunde. enter image description hereWarum eine Transaktion in jeder Zeile so langsam ist?

$stmt = $conn->prepare("INSERT INTO ipTable (ip) VALUES (?)"); 
    $stmt->bind_param("i", $ip); 
    $conn->query('BEGIN'); 
    for($count = 0 ; $count < 20000 ; $count ++){ 
    $ip = rand(1,10000000); 
    $stmt->execute(); 
    } 
    $conn->query('COMMIT'); 
    $stmt->close(); 
    $conn->close(); 

mit Zeitbefehl

time php test.php 



real 0m0.785s 
user 0m0.220s 
sys  0m0.096s 

Aber als ich aus der $ kommentiert conn-> query ('BEGIN'); $ conn-> Abfrage ('COMMIT'); , es läuft mehr als 20 Minuten und weiß nicht, wie viel Zeit ich warten muss, um zu beenden. Ich muss es mit Strg-C stoppen.

 $stmt = $conn->prepare("INSERT INTO ipTable (ip) VALUES (?)"); 
     $stmt->bind_param("i", $ip); 
     //$conn->query('BEGIN'); 
     for($count = 0 ; $count < 20000 ; $count ++){ 
     $ip = rand(1,10000000); 
     $stmt->execute(); 
     } 
     //$conn->query('COMMIT'); 
     $stmt->close(); 
     $conn->close(); 

enter image description here

Antwort

1

Versuchen Sie, auf autocommit Drehen

$conn->autocommit(TRUE);

$conn->autocommit(TRUE); 
$stmt = $conn->prepare("INSERT INTO ipTable (ip) VALUES (?)"); 
$stmt->bind_param("i", $ip); 
//$conn->query('BEGIN'); 
for($count = 0 ; $count < 20000 ; $count ++){ 
    $ip = rand(1,10000000); 
    $stmt->execute(); 
} 
//$conn->query('COMMIT'); 
$stmt->close(); 
$conn->close(); 
+0

Dank es funktioniert, aber warum? –

+0

warum ohne $ conn-> autocommit (TRUE); läuft es langsam? –

+0

Ich denke du hast Autocommit irgendwo falsch gesetzt. Es funktionierte nicht, denn wenn es auf "false" gesetzt ist, muss man sagen, wann die Transaktion beginnen soll und wann (commit). Jetzt ist Autocommit wahr. Jedes Mal, wenn es ausgeführt wird, werden die Änderungen an der Datenbank vorgenommen. – noyanc