Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wolne wykonywanie INSERT do MySQL-a
MiChaSSs
post
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 4
Dołączył: 6.09.2007

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


Hej,
Co prawda aplikacja jest napisana w C (z wykorzystaniem MySQL API) a nie w PHP, ale problem tkwi po stronie MySQL-a stad pisze tutaj a nie na forum C/C++. Program ktory napisalem, ma wrzucac informacje z przeparsowanego pliku tekstowego do bazy danych, problem polega tylko na tym, ze tych danych jest sporo (stad wybralem C a nie PHP). Sprobowalem wrzucic dane tylko z 1 pliku co daje ~ 3487 zapytan do bazy danych i program wykonywal sie przez prawie 3 minuty! Co przy ponad 500 plikach daje wiecznosc (IMG:style_emoticons/default/wink.gif) . No ale pomyslalem, ze moze jest to wina braku optymalizacji programu, wiec postanowilem napisac cos takiego:

  1. int i;
  2.  
  3. for(i =0; i < 3486; i++)
  4. {
  5. mysql_query(mysql_connection, "INSERT INTO `tabela` VALUES(20110608,1234.0,1234.0,1234.0,1234.0,1234)");
  6. }


gdzie tabela to:

  1. CREATE TABLE `tabela` IF NOT EXISTS
  2. (
  3. kolumna_1 DATE DEFAULT NULL,
  4. kolumna_2 FLOAT(5,2) DEFAULT NULL,
  5. kolumna_3 FLOAT(5,2) DEFAULT NULL,
  6. kolumna_4 FLOAT(5,2) DEFAULT NULL,
  7. kolumna_5 FLOAT(5,2) DEFAULT NULL,
  8. kolumna_6 FLOAT(5,2) DEFAULT NULL
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Kod pisalem z pamieci (nie mam teraz dostepu do zrodla programu) wiec moga gdzies byc byki, ale chcialem przekazac tylko sens. Okazalo sie, ze przedstawiony wyzej kod tez wykonuje sie w granicach 3 minut ;/. Mieliscie kiedys podobna sytuacje? Dlaczego tak sie dzieje? Jak to naprawic? Dziekuje za wszelka pomoc, pozdrawiam MD
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




skoro rekordów jest dużo, ale widzę są one krótkie to jednym zapytaniem wkładaj np po 10 rekordów
....values (rekord1), (rekord2), (rekord10)

Wiecej info masz w dokumentacji
http://dev.mysql.com/doc/refman/5.5/en/insert.html
Będzie zdecydowanie szybciej
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Możesz również opakować grupę opreacji insert w transakcje.
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Możliwe, że spowalniaczem są:
a) operacje odczytu plików z dysku,
(IMG:style_emoticons/default/cool.gif) ciągłe nawiązywanie nowych połączeń zamiast używanie jednego przez cały czas skryptu,
c) niezbyt wydajne parsowanie zawartości.

Trudno cokolwiek powiedzieć bez jakiejś faktycznej próbki kodu i tego jak wygląda obróbka plików do formy zapytań. Pamiętaj, że operacje I/O sa zawsze wąskim gardłem i to one głównie spowalniają aplikację.
Go to the top of the page
+Quote Post
MiChaSSs
post
Post #5





Grupa: Zarejestrowani
Postów: 65
Pomógł: 4
Dołączył: 6.09.2007

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


@nospor && @wookieb -> sprobuje (IMG:style_emoticons/default/wink.gif)

@thek

Ad.1 byc moze, ale malo prawdopodobne bo wszystkie pliki maja ~ 40MB (a jest ich nieco ponad 500)
Ad.2 nawiazuje tylko 1 polaczenie przez caly czas pracy programu
Ad.3 nie, bo zrobilem tak, jak to napisalem w 1 poscie zeby to sprawdzic

----------------------------------------------------------------------------------------

EDIT 2011.06.09 10:17


Zmodyfikowalem wczoraj kod i zaimplementowalem tranzakcje -- 10 000 zapytan poszlo w 1.5s, gdzie wczesniej przypominam ~3500 zapytan wrzucalo sie do bazy w 3 minuty (IMG:style_emoticons/default/wink.gif) Dzieki! A teraz kolejne pytanie ... skoro puszczam kilka insertow na raz, w takim razie w jaki sposob moge wyznaczyc maxymalny limit zapytan w trakcie jednej tranzakcji? Przy takim kodzie jaki zaprezentowalem w pierwszym poscie (tylko z wykananiem zapytania PRZED petla "START TRANSACTION" i ZA petla "COMMIT") wczoraj i 100 000 zapytan poszlo w 14s, ale co gdy zapytanie jest bardziej udziwnione? Jak mozna to "wyliczyc"? Przypuszczam, ze ma tutaj znaczenie zmienna max_allowed_packet (w my.conf -- u mnie standardowo 16M), no ale jak wyliczyc ile zapytan da te 16M? Pozdrawiam MD

Ten post edytował MiChaSSs 9.06.2011, 09:17:26
Go to the top of the page
+Quote Post
uupah5
post
Post #6





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 4.09.2010
Skąd: warszawa

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


zabierasz się za to od złej strony.
manual mysql, szukaj składni LOAD DATA LOCAL INFILE 'xxx' INTO TABLE wraz z opcjami

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.09.2025 - 18:38