Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Długi INSERT mysql 5.5
Pacyna
post 21.01.2015, 03:01:38
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 27.08.2010

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


Witam, mam pewną zagwozdkę otóż, mam pewien skrypt, który na mysql 5.1(debian squeeze) działa perfekcyjnie a na mysql 5.5(debian wheezy) już nie tak dobrze, a mianowicie zaimplementowanie ok. 6k rekordów zajmuje mu z 3 minuty albo dłużej, ogólnie jest to w ch.... wolne. Pokaże Wam skrypt, jako że z php rzadko mam do czynienia to nie wiem w czym tkwi problem...

  1. <?php
  2. set_time_limit(3*60*60); // 3 hour should be enough
  3. $sql_conn = mysql_connect('localhost', '*', '*') or die('Nie mogłem połaczyć się z bazą danych');
  4.  
  5. $dir = glob("/pliki/*php");
  6. $i = 0;
  7. rsort($dir);
  8. foreach($dir as $file) {
  9. if(is_readable($file)) {
  10. if($i >= 0 and $i < 6000){
  11. include $file;
  12.  
  13. }
  14. }
  15. $i++;
  16. }
  17.  
  18. $zapytanie = 'DROP TABLE player_deaths';
  19. $wykonaj = mysql_query ( $zapytanie );
  20. $zapytanie = 'CREATE TABLE player_deaths('
  21. . 'id int(11) NOT NULL AUTO_INCREMENT,'
  22. . 'date text NOT NULL,'
  23. . 'name_killed char(30) NOT NULL,'
  24. . 'name_killer char(30) NOT NULL,'
  25. . 'level_killed int(10) NOT NULL,'
  26. . 'PRIMARY KEY(id)'
  27. . ')';
  28. $wykonaj = mysql_query ( $zapytanie );
  29.  
  30. foreach($frags[frag] as $score){
  31. $zapytanie = "INSERT INTO `player_deaths` (`id`, `date`, `name_killed`, `name_killer`, `level_killed`) VALUES ('', '$score[data]', '$score[zabity]', '$score[zabojca]', '$score[poziom_zabitego]')";
  32. $wykonaj = mysql_query($zapytanie);
  33. }

no i to właśnie ten piękny skrypt, niestety nie wiem w czym tkwi problem i jak to zmienić, ale poszukałem kogoś kto ma podobny problem i znalazłem takie rozwiązanie, które u mnie podziałało perfekcyjnie, a mianowicie zmienienie silniku tabeli na MYISAM, rekordy wczytują się szybciej niż dotychczas, dlaczego? Prosiłbym o odpowiedź i ewentualnie nakierowanie co jest nie tak w skrypcie, że na domyślnym silniku wczytuje się bardzo długo(przypomne, że na mysql5.1 wczytuje się bardzo szybko)
Pozdrawiam
Go to the top of the page
+Quote Post
aniolekx
post 21.01.2015, 08:31:25
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

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


zamiast robić jeden insert na rekord, co jest dość powolne, zrób to np w paczkach np po 1000 rekordów.

http://blog.piotrnalepa.pl/2011/03/03/mysq...yisam-a-innodb/
Go to the top of the page
+Quote Post
tzm
post 21.01.2015, 09:07:23
Post #3





Grupa: Zarejestrowani
Postów: 675
Pomógł: 58
Dołączył: 17.12.2013

Ostrzeżenie: (10%)
X----


poza tym chyba nie widziales dlugich insertow... toz to dzieciak jest jeszcze. po zapytaniu 300 linii ++ x 10 tysiecy zwatpisz we wszystko.
Go to the top of the page
+Quote Post
sowiq
post 21.01.2015, 10:33:45
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Sekwencja insertów wykona się dużo, dużo szybciej jak zamkniesz ją w transakcję. http://dev.mysql.com/doc/refman/5.0/en/commit.html
Go to the top of the page
+Quote Post
pmir13
post 21.01.2015, 13:52:28
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Cytat(Pacyna @ 21.01.2015, 03:01:38 ) *
...
Prosiłbym o odpowiedź i ewentualnie nakierowanie co jest nie tak w skrypcie, że na domyślnym silniku wczytuje się bardzo długo(przypomne, że na mysql5.1 wczytuje się bardzo szybko)


Od wersji mysql 5.5 InnoDB jest domyślnym silnikiem tabel tworzonych bez podania konkretnego silnika w CREATE TABLE.
Przedmówcy wyjaśnili, że inserty do InnoDB wykonują się szybciej albo zawarte w jednej transakcji, albo jako jeden duży insert, albo też przy wyłączonym na czas insertów autocommit. Bo bez tego każdy insert jest osobną transakcją (InnoDB to silnik transakcyjny, w przeciwieństwie do wcześniejszego domyślnego MyISAM) a każda nawet najmniejsza zakończona transakcja z definicji wymaga zapisania stanu na dysku zamiast trzymania w buforach.
Oczywiście powrot do MyISAM przywróci poprzedni stan działania, jednak w roku 2015 wypadałoby znać InnoDB, nie mówiąc o zaprzestaniu używania przestarzałych funkcji z API mysql_.

http://dev.mysql.com/doc/refman/5.5/en/inn...default-se.html
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: 19.04.2024 - 22:24