Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zbyt wolne inserty
Forum PHP.pl > Forum > PHP
Rozpalacz
Mam skrypt który insertuje mi 500 rekordów. Skrypt jest umieszczony na SAX.PL oraz na PHP5.SK
Na SAX.PL insert 500 rekordów trwa 22 sekundy a na PHP5.SK trwa 12 sekund. Dlaczego trwa to tak długo? Czy można to jakoś przyśpieszyć? Skrypt któy uruchamiam:

  1. <?php
  2.  
  3. const DB_MYSQLI_HOST = 'localhost';
  4. const DB_MYSQLI_PORT = 3306;
  5. const DB_MYSQLI_USER = 'xxxxxxxxx';
  6. const DB_MYSQLI_PASS = 'xxxxxxxxxxxx';
  7. const DB_MYSQLI_NAME = 'name_name';
  8. const DB_MYSQLI_CHAR = 'UTF-8';
  9.  
  10. $db_info = array( "db_host" => DB_MYSQLI_HOST,
  11. "db_port" => DB_MYSQLI_PORT,
  12. "db_user" => DB_MYSQLI_USER,
  13. "db_pass" => DB_MYSQLI_PASS,
  14. "db_name" => DB_MYSQLI_NAME,
  15. "db_charset" => DB_MYSQLI_CHAR
  16. );
  17.  
  18. $instance = NULL;
  19.  
  20. try {
  21. $instance = new PDO("mysql:host=".$db_info['db_host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
  22. $instance->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
  23. $instance->setAttribute( PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING );
  24. $instance->query('SET NAMES ' . $db_info['db_charset']);
  25. $instance->query('SET CHARACTER SET ' . $db_info['db_charset']);
  26. }
  27. catch(PDOException $e) {
  28. echo "Access denied";
  29. LOG::e('Brak połączenia z bazą');
  30. }
  31.  
  32. $stmt = $instance->prepare('DROP TABLE IF EXISTS Test_tbl');
  33. if (!$stmt->execute())
  34. echo implode('; ', $stmt->errorInfo());
  35.  
  36. $stmt = $instance->prepare('CREATE TABLE Test_tbl (IMIE VARCHAR(100), NAZWISKO VARCHAR(100), ADRES VARCHAR(100))');
  37. if (!$stmt->execute())
  38. echo implode('; ', $stmt->errorInfo());
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. $a = array();
  46. for($x=0; $x<500; $x++) {
  47. array_push($a, array('imie'=>'Pablo'.$x, 'nazwisko'=>'Picasso'.$x, 'adres'=>'Nowowiejska '.$x));
  48. }
  49.  
  50. echo date("Y-m-d H:i:s:u") . '<BR>';
  51.  
  52. foreach($a as $b) {
  53. $stmt = $instance->prepare('INSERT INTO Test_tbl (IMIE, NAZWISKO, ADRES)
  54. values (:IMIE, :NAZWISKO, :ADRES)');
  55.  
  56. $stmt->bindValue(':IMIE', $b['imie'], PDO::PARAM_STR);
  57. $stmt->bindValue(':NAZWISKO', $b['nazwisko'], PDO::PARAM_STR);
  58. $stmt->bindValue(':ADRES', $b['adres'], PDO::PARAM_STR);
  59.  
  60. if (!$stmt->execute()) echo (implode('; ', $stmt->errorInfo()));
  61. }
  62.  
  63. echo date("Y-m-d H:i:s:u") . '<BR>';
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72. $stmt = $instance->prepare('DROP TABLE Test_tbl');
  73. if (!$stmt->execute())
  74. echo implode('; ', $stmt->errorInfo());
  75.  
  76. ?>
Pyton_000
dodaj do tabeli pole ID z kluczem PrimaryKey
skowron-line
http://php.net/manual/en/language.variables.scope.php (static)
dla
  1. $stmt = $instance->prepare('INSERT INTO Test_tbl (IMIE, NAZWISKO, ADRES)
  2. values (:IMIE, :NAZWISKO, :ADRES)');

tak by to nie bylo przy kazdej iteracji przygotowywane bo to sie nie zmienia, zmieniaja się tylko wartosci ktore bindujesz
Rozpalacz
Zrobiłem test i wyprowadziłem linijkę
  1. $stmt = $instance->prepare('INSERT INTO Test_tbl (IMIE, NAZWISKO, ADRES)
  2. values (:IMIE, :NAZWISKO, :ADRES)');

poza foreach ale nadal bez zmian.
ctom
to powinno Ci skrócić czas pdo.begintransaction.php
Rozpalacz
$instance->beginTransaction();

skróciło czas ładowania danych z kilku minut do 2 sekund smile.gif

Dzięki za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.