sql >> Databáze >  >> RDS >> Mysql

PHP PDO vloží více (10000+) stejných řádků pomocí bindParam. Dobrý trénink?

Nemusíte bindParam() během každé iterace cyklu. BindParam() způsobí, že proměnné $v1, $v2 atd. jsou svázány odkazem , takže vše, co musíte udělat, je změnit hodnoty těchto proměnných a poté znovu spustit dotaz. To by mohlo snížit režijní náklady.

Také se můžete vyhnout volání intval() pokaždé, když procházíte smyčkou. Jen se ujistěte, že $cloneCount je jednou vynucen na celé číslo , před smyčkou. To je velmi malé zlepšení, ale je to dobrá praxe.

$cloneCount = (int) $cloneCount;

... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);

for ($i=0; $i < $cloneCount; $i++) 
{
  $v1 = /* something */
  $v2 = /* something */
  $insertG->execute();
}

Měli byste se také vyhnout automatickému zavazování. Snižte režii transakce MySQL na provedení příkazu spuštěním explicitní transakce , vložení několika tisíc řádků a následné potvrzení transakce.

Nejlepší způsob, jak urychlit hromadné INSERT tisíců podobných řádků do jedné tabulky, je použít NAČTE MÍSTNÍ INFILE DAT místo INSERT. To běží 10-20x rychleji než INSERT řádek po řádku, i když používáte parametry, transakce, víceřádkové vkládání a jakýkoli jiný trik, který vás napadne.

I když musíte použít PHP k zápisu dat do souboru .CSV na disk a poté na tento soubor použít LOAD DATA LOCAL INFILE, je to stále mnohem rychlejší.

Viz také Rychlost příkazů INSERT v příručce MySQL, kde najdete další tipy.



  1. Jak získat rok z data v T-SQL

  2. Jak vypočítám velikost tabulek v Oracle

  3. Na jaký sloupec by měl být umístěn seskupený index?

  4. MYSQL odpovídá dotazu dvě tabulky