Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zbyt wolne inserty
Rozpalacz
post 9.01.2015, 22:53:01
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Rozpalacz 9.01.2015, 22:57:01
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Pyton_000
post 10.01.2015, 00:09:43
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


dodaj do tabeli pole ID z kluczem PrimaryKey
Go to the top of the page
+Quote Post
skowron-line
post 10.01.2015, 00:10:02
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Rozpalacz
post 10.01.2015, 07:05:22
Post #4





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
ctom
post 10.01.2015, 11:16:39
Post #5





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

Ostrzeżenie: (0%)
-----


to powinno Ci skrócić czas pdo.begintransaction.php


--------------------
Polecam MyDevil hosting idealny dla deweloperów
Go to the top of the page
+Quote Post
Rozpalacz
post 10.01.2015, 11:37:16
Post #6





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

Ostrzeżenie: (0%)
-----


$instance->beginTransaction();

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

Dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 21:17