2011-04-11 22 views
5

Tôi nhận được một dãy gồm 650 hàng. Chèn này bằng cách sử dụng PDO mất từ ​​10-15 giây trên máy tính địa phương của tôi. Rất chậm. Đây có phải là vì đĩa đọc/ghi? Hoặc nó có thể là cái gì khác?Chèn các giá trị từ multidim. mảng sử dụng PDO mất nhiều thời gian. Có cách nào tốt hơn?

Đây là mảng của tôi (lần đầu tiên 4 hàng):

Array 
(
[0] => Array 
    (
     [0] => 3 
     [1] => 1 
    ) 

[1] => Array 
    (
     [0] => 3 
     [1] => 2 
    ) 

[2] => Array 
    (
     [0] => 3 
     [1] => 5 
    ) 

[3] => Array 
    (
     [0] => 8 
     [1] => 1 
    ) 
) 

Và đây là mã của tôi:

$stmt = $this->db->prepare("INSERT INTO sl_link_store_category (item_a_ID, item_b_ID) VALUES (:item_a_ID, :item_b_ID)"); 

foreach($my_array as $row) { 
    $stmt->execute(array(':item_a_ID' => $row[0], ':item_b_ID' => $row[1])); 
} 

SOLUTION

Đối với những người đang tự hỏi, eis cô của tôi giải pháp chèn nhiều hàng
chỉ sử dụng một $stmt->execute:

$input_arr; // This array one has lots of values 

    $sql = "INSERT INTO sl_link_store_category (field_a, field_b) VALUES "; 

    $i = 0; 
    // I create the query string with unique prepared values 
    // I could probably have used a for loop since I'm not using any 
    // values from $row 
    foreach($input_arr as $row) { 
     $i++; 
     $sql .= "(:field_a_$i, :field_a_$i), "; 
    } 

    // Remove the last comma (and white space at the end) 
    $sql = substr(trim($sql), 0, -1); 

    $stmt = $this->db->prepare($sql); 

    // I need to create a new associative array with field name 
    // matching the prepared values in the SQL statement. 
    $i = 0; 
    $arr = array(); 

    foreach($input_arr as $row) { 
     $i++; 
     $arr[":field_a_$i"] = $row[0]; 
     $arr[":field_b_$i"] = $row[1]; 
    } 

    $stmt->execute($arr); 
    } 
+0

Bạn đang sử dụng công cụ cơ sở dữ liệu nào (MyISAM, InnoDB ...)? – Matthew

+0

@konforce - Tôi đang sử dụng InnobDB. – Steven

+0

sau đó bạn có thể muốn xem xét việc thiết lập 'innodb_flush_log_at_trx_commit = 2' và' sync_binlog = 0' trong cấu hình MySQL trên máy phát triển của bạn. Điều này sẽ giảm thiểu xả đĩa và có thể tăng tốc ứng dụng của bạn bằng nhiều yếu tố. – Matthew

Trả lời

3

Lý do có thể chậm có thể thay đổi tùy theo nhiều yếu tố.

Cân nhắc sử dụng một truy vấn để chèn nhiều bản ghi PDO Prepared Inserts multiple rows in single query

+0

Cảm ơn. Nó giúp tôi đi đúng hướng. Tôi thực sự đã thử nó trước đó, nhưng đã không làm cho nó hoạt động. Nhưng bây giờ tôi đã tìm ra giải pháp. Xem ở trên. – Steven

Các vấn đề liên quan