Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ekstremalne wolny MySQL?
Forum PHP.pl > Forum > Bazy danych
Skie
Witam,
projektuję dość dużą aplikację opartą o PHP i MySQL i zauważyłem, że wydajność leży... starałem się przyśpieszać maksymalnie wszystko, myśląc, że to wina PHP.
Okazało się, że problemem jest... ekstralmnie wolno działający MySQL.

Przeprowadziłem test, na tabeli:

  1. CREATE TABLE IF NOT EXISTS `positions` (
  2. `id` int NOT NULL AUTO_INCREMENT,
  3. `pid` INT NOT NULL DEFAULT '0',
  4. `loc_id` INT NOT NULL DEFAULT '0',
  5. `x` INT NOT NULL DEFAULT '0',
  6. `y` INT NOT NULL DEFAULT '0',
  7. PRIMARY KEY (`id`),
  8. UNIQUE (`pid`),
  9. INDEX (`loc_id`)
  10. );


Do tej tabeli dałem dosłownie jeden wpis, następnie wykonałem komendę:
  1. UPDATE positions SET x=5, y=5 WHERE id=1


Czas wykonania wyniósł 0.15s.
Dlaczego MySQL potrzebuje tak monstrualną ilośc czasu do wykonania tak prostego zapytania na tabeli zawierjący pojedynczy rekord?
Od siebie dodam, że serwer MySQL na którym pracuje jest offline i dedykowany pod aplikację, więc na pewno nei jest winą przeciążenie ilością zapytań.
Akceptowalna ilość czasu na to zapytanie to max 0.01s.

Co mogę zrobić by to przyśpieszyć?
sowiq
W jaki sposób mierzysz wydajność? Odpalasz zapytanie bezpośrednio na serwerze bazy danych, czy łączysz się do niego zdalnie? Pytam, bo opóźnienia mogą się generować na warstwie sieciowej.

A odnośnie szukania optymalizacji w PHP, ktoś na jakiejś prezentacji pokazał taki diagram przyczynowo skutkowy:

Kod
My application is slow  ------------>>   it's your database.
Skie
Wydajność mierzę bezpośrednio na MySQL, przez konsolę.

Masz rację, że to zazwyczaj baza danych jest tym słabym ogniwem, ale tylko w przypadku gdy baza danych jest ogromna lub ma masę zapytań na sekundę. Ale w moim przypadku do jasnej ciasnej jest ona prawie pusta...
pmir13
Może spróbuj dokładniej obejrzeć co tyle czasu zajmuje?

  1. SET profiling=1;
  2. UPDATE positions SET x=5, y=5 WHERE id=1;
  3. SHOW profile;
  4. SET profiling=0;
Skie
Przeprowadziłem trochę dokładniejsze testy, wrzuciłem do tabeli 100.000 rekordów i następnie korzystałem z zapytania:
  1. UPDATE positions SET x=5, y=5 WHERE pid={number}

oraz
  1. SELECT x, y FROM positions WHERE pid={number}


Gdzie number to losowa liczba z przedziału od 1 do 100.000

Czas wykonania wyniósł:
SELECT: ~0.05s
UPDATE: ~0.40s

Potem usunąłem z tablicy INDEX z pola loc_id i UNIQUE z pid. i powtórzyłem testy. Tym razem wyszło mi:
SELECT: ~0.09s
UPDATE: ~0.04s

Te wyniki także mi się nie podobają - usuwając indeksy spodziewałem się uzyskać lepszy wynik - ale 10 krotne przyśpieszenie UPDATE w zmiana za 2 krotne spowolnienei SELECT.
Biorąc pod uwagę, że przy większości tabel nie jestem jednoznacznie w stanie stwierdzić czy częściej będą odczytywane czy zapisywane, wychodzi na to, że najlepiej będzie jak usunę wszystkie indeksy z bazy... Coś tutaj ewidetnie nie halo.


@UP:
Wykorzystałem metodę , którą mi podałeś i wyszło mi:

~23% czasu to init
~9% updating
~68% query end (?)
reszta praktycznie zerowa


EDIT:
Próbowałem z różnymi ustawieniami cache , przydziałem pamięci MySQL i metodami jej obsługi ale nic nie pomagało.

Ostatecznie przekonwertowałem całość na PostgreSQL... Wydajność aplikacji wzrosła przy ciężkich skryptach 2-krotnie, a przy lekkich nawet 200 razy... Temat zamykam.
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.