Temat: [php+mysql}Optymalizacja strony www

Witam,
Mam stronę z ogłoszeniami. W bazie jest około 3000 ogłoszeń (opis+zdjęcia)
Strona główna serwisu bardzo powoli się wczytuje, trwa to kilkadziesiąt sekund. Reszta podstron działa normalnie.
Jak mogę sprawdzić co najbardziej powoduje takie spowolnienia?

konto usunięte

Temat: [php+mysql}Optymalizacja strony www

Trzymasz w bazie zdjęcia? Czy linki do nich?
I co wczytujesz na głównej stronie? Wszystkie ogłoszenia?Sebastian Olszewski edytował(a) ten post dnia 25.10.10 o godzinie 20:17

Temat: [php+mysql}Optymalizacja strony www

Wojciech Potocki:
Witam,
Mam stronę z ogłoszeniami. W bazie jest około 3000 ogłoszeń (opis+zdjęcia)
Strona główna serwisu bardzo powoli się wczytuje, trwa to kilkadziesiąt sekund. Reszta podstron działa normalnie.
Jak mogę sprawdzić co najbardziej powoduje takie spowolnienia?

A jakie operacje są wykonywane na stronie głównej? Jeśli "międlisz" wszystkie dane to nic dziwnego. Odczytuj tylko co jest niezbędne. Używaj limitów przy odczycie z bazy (jeśli nie potrzebujesz wszystkich rekordów). Optymalizuj zapytania tak, żeby było jak najmniej odwołań do bazy i zwracaj tylko te kolumny, których faktycznie potrzebujesz.
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: [php+mysql}Optymalizacja strony www

Można użyć różnych narzędzi:
- xdebug,
- firebug,
- przegląd logów z mysql,
- jeśli serwis jest na jakimś frameworku, to można użyć dostarczonych z nim debugerów,
- ostatecznie można wrzucić w paru miejscach wywołanie funkcji time() i w ten sposób stwierdzić, który fragment kodu/zapytanie zajmuje najwięcej czasu.

Podstawa to namierzyć konkretnego sprawcę i próbować optymalizować.

Temat: [php+mysql}Optymalizacja strony www

Serwis jest oparty na Kohanie 3
Oto kod kontrolera


public function action_index()
{
if(isset($_POST['formLogowanie']))
{
if($this->logowanie())
$this->request->redirect('profil');
}
$this->set_title('- Noclegi, baza noclegowa, turystyka, wakacje, kwatery');
$view = new View('home'); $this->template->content = $view;
$config = ORM::factory('config', 1);

/*Poniżej pobieram ogłoszenia z perspektywy (widoku) o nazwie advert, pobieram tylko 10 ogłoszeń, bo tyle jest zapisanych w konfiguracji w tabeli w powyższej linijce*/
$advert = ORM::factory('advert')
->where('active', '=', '1')
->order_by('id', 'DESC')
->limit($config->ilosc_ofert)
->find_all();
$view->advert = $advert;

/*Tutaj ta sama akcja co powyżej ale pobieram tylko promowane ogłoszenia*/
$slideshow = ORM::factory('advert')
->where('active', '=', '1')
->where('promowana', '=', '1')
->order_by(DB::expr('RAND()'))
->limit('6')
->find_all();
$view->slideshow = $slideshow;
}
Michał Sznurawa

Michał Sznurawa Scala Developer

Temat: [php+mysql}Optymalizacja strony www

Najpierw się zastanów, czy to problem frontendowy czy backendowy. To narzędzie pomaga sprawdzić "jakość" danych serwowanych użytkownikowi: http://www.websiteoptimization.com/services/analyze/ . Może masz na str. głównej ciężkie flashe, albo jakieś applety java?

Jeśli backend, to podejrzani:
- ten order by rand() może być zły
- nie wiadomo, jak wygląda kod perspektywy advert
chociaż 3k wierszy to niespecjalnie wiele.
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: [php+mysql}Optymalizacja strony www

Dwa zapytania są w tym kontrolerze. To dużo roboty nie ma, żeby każde z nich ręcznie zapuścić np. w phpMyAdminie i zobaczyć ile czasu będzie się wykonywać.
Przyjrzałbym się też temu widokowi - może ma jakieś dziwne złączenia albo podzapytania. No i indeksy trzeba sprawdzić :)

Order by rand() na pewno nie jest demonem szybkości przy dużej tabeli.

Sprawdziłbym najpierw firebugiem czy faktycznie jakiś request nie blokuje pobierania. Potem xdebugiem ile czasu wykonuje się sam kontroler i poszczególne zapytania.
Marcin Lulek

Marcin Lulek Programista -
WebReactor

Temat: [php+mysql}Optymalizacja strony www

Wojciech Potocki:
Serwis jest oparty na Kohanie 3
Oto kod kontrolera

rand() - ile jest wierszy w tej tabeli ? jesli wiecej niz 1000 to rand nie jest dobrym rozwiazaniem - ale nawet przy 10k rekordow nie powinienes czekac kilku sekund, ja mysle ze problemem jest to ze nie masz indeksu gdzies albo to czekanie nie jest zwiazane z baza - przy 5k wierszy nawet skan tabeli nie powinien byc problemem na tyle zeby czekac kilka sekund - chyba ze maszyna jest zarobiona

Temat: [php+mysql}Optymalizacja strony www

Wygląda na to, że problemem jest widok adverts, ponieważ wylistowanie zawartości w phpmyadmin trwa około 13 sekund.
Paweł Lenk

Paweł Lenk informatyk,
programista,
bezpieczeństwo,PBX
Asterisk

Temat: [php+mysql}Optymalizacja strony www

<zapytanie> PROCEDURE ANALYSE();
OPTIMIZE TABLE `<nazwa>` ;
ALTER TABLE `<nazwa>` ORDER BY `<nazwa kolumny z primary key>`;

I oczywiście magiczne indexy. Jeżeli jest jakieś VIEW, OUTER JOIN, albo inna zaraza, czy są na łączonych kolumnach indexy, czy nie ma ich w nadmiarze...
Ogólna optymalizacja DB.

Temat: [php+mysql}Optymalizacja strony www

Paweł Lenk:
<zapytanie> PROCEDURE ANALYSE();
OPTIMIZE TABLE `<nazwa>` ;
ALTER TABLE `<nazwa>` ORDER BY `<nazwa kolumny z primary
> key>`;

I oczywiście magiczne indexy. Jeżeli jest jakieś VIEW, OUTER JOIN, albo inna zaraza, czy są na łączonych kolumnach indexy, czy nie ma ich w nadmiarze...
Ogólna optymalizacja DB.

W widoku mam LEFT JOIN. Ale nie działa mi polecenie dodające indeks, próbuję dodać tak samo jak do tabeli ale coś nie działa:(
Waldemar Jonik

Waldemar Jonik właściciel,
webmaster,
programista, JW Web
Development

Temat: [php+mysql}Optymalizacja strony www

trzeba pamiętać, że w mysql widoki działają często bardzo źle -zwłaszcza jak potem widok jest używany do bardziej skomplikowanych zapytań.
bywa tak, że używając widoku a potem sortowania czy złączania tak naprawdę pracujesz na tabeli bez indeksów.

już kiedyś robiłem audyt aplikacji napisanej w mysql z widokami - po zamianie tych widoków na zwykłe join normalnych tabel zapytania działały nawet 100 razy szybciej.

radze poczytać sobie np:

http://www.mysqlperformanceblog.com/2007/08/12/mysql-v...

http://www.barneyb.com/barneyblog/2007/11/25/just-say-...
Mariusz Lewandowski

Mariusz Lewandowski Senior Java
Developer

Temat: [php+mysql}Optymalizacja strony www

Waldemar Jonik:
(...)

radze poczytać sobie np:

http://www.mysqlperformanceblog.com/2007/08/12/mysql-v...

http://www.barneyb.com/barneyblog/2007/11/25/just-say-...

Cenna informacja, czy w Oracle widoki tez tak zle dzialaja?
Paweł Lenk

Paweł Lenk informatyk,
programista,
bezpieczeństwo,PBX
Asterisk

Temat: [php+mysql}Optymalizacja strony www

Mariusz Lewandowski:
Waldemar Jonik:
(...)

radze poczytać sobie np:

http://www.mysqlperformanceblog.com/2007/08/12/mysql-v...

http://www.barneyb.com/barneyblog/2007/11/25/just-say-...

Cenna informacja, czy w Oracle widoki tez tak zle dzialaja?

W Oracle nie, dodam w DB2 też nie.

W MySQL zależy też jaki widok. W każdej bazie jest jedna rzecz doprowadzająca do szału. Niby prosty SQL, a jak baza zrobi plan wykonania jego, to ma się ochotę wyrzucić serwer za okno z całą szafą. A bo.. stwierdził że ma gdzieś indeks bo mu się nie podoba. Dlatego najważniejsza jest analiza planów, wszelkie tam ekspleiny analizy i tym podobne herezje. Słyszałem że duże bazy sam plan zapytania i kompilacje będzie majstrować 15 minut, a samo execute sekundę. Nie ma na to złotej recepty. Może okazać się że na Oracle dany view działa koszmarnie, a na MySQL śmiga i odwrotnie.

Index oczywiście na tabele, nie na view. W DB2 można też na view... ponoć, nigdy nie robiłem.
Prawdopodobnie rozwalona tabela, albo nie ten index na dany typ kolumny, albo ten engine nie obsługuje akurat tego typu indexu. Można spróbować zawsze dać klucze zewnętrzne, ale one działają nie ze wszystkimi enginami.

Dopiszę jeszcze że brak indeksów zabije Ci każdy join. Chociaż primary, o ile dane się nie dublują.Paweł Lenk edytował(a) ten post dnia 29.10.10 o godzinie 01:59

Temat: [php+mysql}Optymalizacja strony www

Miałem pozakładane indeksy PRIMARY.

Faktycznie problemem okazał się LEFT JOIN. Już zmieniłem zapytanie i teraz działa, aż miło.



Wyślij zaproszenie do