2011-04-11 2 views
5

Ho ottenuto un array di 650 righe. Inserimento di questo tramite PDO richiede tra 10-15 secondi sul mio computer locale. Questo è molto lento. Questo a causa del disco di lettura/scrittura? O potrebbe essere qualcos'altro?Inserimento di valori da multidim. l'array usando PDO richiede molto tempo. C'è un modo migliore?

Questa è la mia serie (prime 4 righe):

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 
    ) 
) 

E questo è il mio codice:

$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])); 
} 

SOLUZIONE

Per chi si sta chiedendo, i suoi eis mia soluzione per l'inserimento di più righe
utilizzando solo uno $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

Quale motore di database (MyISAM, InnoDB ...) stai usando? – Matthew

+0

@konforce - Sto usando InnobDB. – Steven

+0

quindi potresti prendere in considerazione l'impostazione di 'innodb_flush_log_at_trx_commit = 2' e' sync_binlog = 0' nella configurazione di MySQL sul tuo computer di sviluppo. Ciò ridurrà al minimo lo svuotamento del disco e può accelerare l'applicazione di molti fattori. – Matthew

risposta

3

Il motivo potrebbe essere che lenta può variare in base a un sacco di fattori.

considerare l'utilizzo di una query per inserire più record PDO Prepared Inserts multiple rows in single query

+0

Grazie. Mi ha fatto sulla buona strada. In realtà l'ho provato prima, ma non l'ho fatto funzionare. Ma ora ho trovato la soluzione. Vedi sopra. – Steven