Devo essere in grado di inserire da una richiesta di modulo 10'000 + riga simile in una volta. Al momento l'ho fatto con una istruzione preparata su una riga ripetuta in loop 10.000 volte dove reindirizzamentoParam ogni var.PHP PDO inserisce più (10000+) stesse righe utilizzando bindParam. Buona pratica?
for ($i=0; $i < intval($cloneCount); $i++)
{
... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);
$insertG->execute();
}
Ci vogliono quasi 30 secondi per raggiungere e non è certamente una buona pratica. Oggi sono 10'000 ma domani potrebbero arrivare a 100'000.
Se inserisco più righe in una query con (v1,v2),(v1,v2)...
ho bisogno di associare ogni valore a un nuovo parametro, quindi credo che avrei bisogno di avere quasi 100'000 bindedParam in una query. Se è UTF-8 e conto circa 2 byte (so che può arrivare a 4) per char la mia query sarà di circa 10 o 20 MB e il server mysql è su un'altra macchina. Dicendo questo sono sorpreso che ci sono voluti solo 30 secondi per la mia richiesta mal progettata per avere successo.
C'è un modo per inviare solo una riga e dire al server mysql di replicare l'ultima riga 10.000 volte?
EDIT soluzione parziale
seguito consigli Bill Karwin e Zsolt Szilagy. Sono riuscito a scendere a 5-6 secondi con le seguenti modifiche di un inserto 10'000 ad un server MySQL remoto:
$dataBase->beginTransaction();
$insertG = $dataBase->prepare('INSERT INTO G...)
...
10 * bindParam of all kinds
for ($i=0; $i < 10000; ++$i)
{
$hashKey = sha1(uniqid().$i); //$hashKey is a binded param
$insertG->execute();
}
$dataBase->commit();
Spostare la parte count() fuori dal ciclo è molto più di un piccolo miglioramento, dato che PHP gestisce il conteggio abbastanza lentamente. Buon punto! Un modo normale per farlo è ($ i = 0, $ max = count ($ array); $ i <$ max; $ i ++) –
@ZsoltSzilagy, è vero, ma l'OP non stava facendo count() in il ciclo, stava facendo intval(). Non è così costoso come count(), ma è comunque una chiamata di funzione e ogni piccolo miglioramento è utile se si esegue un ciclo di oltre 100.000 volte. –
Eah hai ragione, avrei dovuto scorrere di nuovo. :) –