2017-04-14 35 views
2

表格一開始是空的。
當我在20000行之後提交事務時,它的成本不到1秒。 enter image description here爲什麼每一行提交事務都很慢?

$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(); 

隨着時間的命令

time php test.php 



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

但是當我註釋掉$ conn->查詢( 'BEGIN'); $ conn->查詢( '提交'); ,它運行了20多分鐘,不知道我需要等多久才能完成。我必須用ctrl-c來停止它。

 $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

回答

1

嘗試打開自動提交

$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

感謝它的工作,但是爲什麼呢? –

+0

爲什麼沒有$ conn-> autocommit(TRUE);它運行緩慢? –

+0

我想你有autocommit設置爲false的地方。所以它不起作用,因爲當設置爲false時,你必須告訴它何時開始事務以及何時完成(提交)。現在自動提交是真實的。每次執行它都會對數據庫進行更改。 – noyanc