Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długi INSERT mysql 5.5
Forum PHP.pl > Forum > Bazy danych > MySQL
Pacyna
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
aniolekx
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/
tzm
poza tym chyba nie widziales dlugich insertow... toz to dzieciak jest jeszcze. po zapytaniu 300 linii ++ x 10 tysiecy zwatpisz we wszystko.
sowiq
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
pmir13
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
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.