publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
18 skomentuj »

TAGI: php , mysql , programowanie , optymalizacja

2010-06-21 09:04  |  Michał Beyer

Optymalizacja w PHP i MySQL. Część 1: wprowadzenie teoretyczne i podstawowe zasady

Optymalizacja w PHP i MySQL. Część 1: wprowadzenie teoretyczne i podstawowe zasady

Język PHP wraz z bazą danych MySQL są nadal najczęściej używanymi rozwiązaniami przy tworzeniu aplikacji webowych. Wzrost zainteresowania projektem wymusza często poprawę istniejącego kodu, w celu uzyskania lepszej wydajności oferowanej usługi. Nie wystarczy wtedy podstawowa umiejętność pisania działającego kodu, ale także znajomość tworzenia bardziej optymalnych rozwiązań.

Spis treści

  1. Wprowadzenie.
  2. Definicja optymalizacji
  3. Brak uniwersalnych rozwiązań
  4. Dlaczego warto optymalizować już w fazie planowania?
  5. Model klient-serwer
  6. Limity czasu odpowiedzi
  7. Nieskomplikowana praktyka. Przykłady drobnej optymalizacji w PHP
  8. Nieskomplikowana praktyka. Przykład drobnej optymalizacji zapytań SQL
  9. Ciąg dalszy nastąpi...

Artykuł ten jest pierwszym z naszej nowej serii poświęconej optymalizacji. Znajdziecie tu trochę teorii i ogólnych zasad, jakimi należy kierować się przy poprawianiu własnego kodu. Celem całej linii tekstów jest nakreślenie osobom piszących w PHP i korzystających z możliwości MySQL reguł oraz praktycznych przykładów bardziej wydajnych metod programowania.

Definicja optymalizacji

Optymalizacją w informatyce nazywamy ciąg działań, dzięki którym osiągamy poprawę wydajności danego programu. Chrakteryzuje się to przede wszystkim zmniejszeniem użycia pamięci maszyny, na której się on znajduje oraz zwiększeniem szybkości działania samego programu.

Zwiększenie wydajności można uzyskać na kilku różnych płaszczyznach, poczynając od modernizacji i uproszczenia działań matematycznych lub fizycznych w stosowanych algorytmach, przechodząc przez wymianę użytych w aplikacji funkcji, konstrukcji językowych oraz kwarend, a kończąc na konstruowaniu działań w kilku językach, poprzez zastosowanie programowania hybrydowego.

Na płaszczyźnie tworzenia aplikacji internetowych kod można także dostosowywać pod kątem zgodności ze standardami oraz wyszukiwania przez wyszukiwarki internetowe, co można podpiąć pod kategorię pozycjonowania.

Rysunek 1: przykładowy proces optymalizacji dla wyszukiwarek internetowych.

Do ostatniego kryterium należy także inny typ optymalizacji - treści. Dla użytkownika danej strony jest on o tyle ważny, że zwiększa przystępność znajdujących się na niej zasobów.

Dlaczego warto optymalizować już w fazie planowania?

Jeżeli przeznaczeniem nowo budowanego serwisu jest dłuższy, a nawet komercyjny byt, warto planować kwestie wydajnościowe już we wstępnej fazie projektowania. Nie zaoszczędzi to wszystkich, przyszłych poprawek w kodzie, ale może pozwolić na uniknięcie potrzeby modyfikacji całego lub większych części skryptu.

Przede wszystkim należy przemyśleć to, jaki jest cel tworzonej przez nas usługi, do kogo ją kierujemy i jakie będziemy mieli wobec niej oczekiwania. Odpowiedzi na te pytania pozwolą na wstępne ocenienie, jakiego typu serwer będzie potrzebny, jakie oprogramowanie będzie niezbędne do pracy, czy jakie obciążenie będzie mogła generować strona - i to ze sporym wyprzedzeniem czasowym. Warto więc poświęcić trochę czasu na trzeźwą analizę celów, możliwości i potrzeb.

 

Rysunek 2: techniczny proces związany z optymalizacją w projektowaniu.

Na co warto więć zwrócić uwagę, kalkulując wymagania? Przy dużych rozwiązaniach - na przykład na alokowanie danych względem oczekiwań odnośnie do generowanego obciążenia. W takich przypadkach stworzony kod PHP może być tylko małą przyczyną tworzonego problemu, a co za tym idzie - należy skupić się na zapytaniach SQL. Można więć wysunąć wniosek, że czasem skorzystanie z metody zapisu do plików może być bardziej wydajne niż operowanie na jakiejkolwiek bazie danych.

«poprzednia 1 2 3 4 następna »

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
18 skomentuj »

Komentarze

  • sokzzuka

    #1 sokzzuka 2010-06-21 13:55:46 0

    nic ten artykuł nie wnosi, co do optymalizacji, to optymalizacji kodu nie należy przeprowadzać przed ukończeniem projektu, inaczej będziemy wybierać rozwiązania szybsze a nie te które przyniosą efekt oczekiwany dla zleceniodawcy

    IP: 77.236.0.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

  • dAREuS

    #2 dAREuS® 2010-06-21 14:13:26 0

    Ten artykuł to wstęp do większego cyklu. Myślę, że finalnie będziecie usatysfakcjonowani.

    IP: 188.121.11.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4

  • Jacek_S

    #3 Jacek Smolak® 2010-06-21 14:32:02 0

    Ja osobiście jestem ciekaw optymalizacji po stronie MySQL. Liczę na informacje o indeksach, wyjaśnienie informacji z 'EXPLAIN' i jak się z nimi obchodzić (inne sposoby zapytań, praktyki pozwalające uniknąć korzystania z 'temporary' i 'filesort' itd.). Bo czasami lepiej jest dać PHP coś zrobić (kosztem niewielkiej ilości RAM'u) niż MySQL :)

    Pozdrawiam i czekam na dalsze części artykułu.

    IP: 81.161.199.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)

  • m1chu

    #4 m1chu® 2010-06-21 18:24:58 0

    @sokzzuka:

    Z praktycznego punktu widzenia nic nie wnosi. Ale wystarczy przeczytać temat żeby dostrzec, że nie tej płaszczyzny on dotyczy. I wprost przeciwnie, warto planwować target i pewne kwestie dotyczące samego kodu, i przed, i w trakcie jego pisania. Inaczej wspominany zleceniobiorca, jeżeli będzie miał o tym jakiekolwiek pojęcie, może zarządać przepisania go od nowa widząc to co stworzył bez rozmysłu programista. Wszystko to podsumował w jednym zdaniu Darek.

    Co do wypowiedzi @Jacka S. - chętnie posłucham wszelkich sugestii co do następnych części serii :]

    IP: 85.221.146.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

  • Czytacz

    #5 Czytacz 2010-06-22 01:05:16 0

    Przykład dotyczący optymalizacji zapytania z pętlą for niezbyt udany, większość czytających prawdopodobnie zauważy, że 10/5 = 5, więc nie trzeba żadnej zmiennej dodatkowej, moim zdaniem trzeba było pokazać jakiś inny przykład np. z długością łańcucha czy rozmiarem tablicy

    Optymalizacja zapytania z count() też moim zdaniem niewiele pokazuje, prawie na 100% testowano na typie tabeli z silnikiem MyIsam, a on przechowuje liczbę wierszy wewnętrznie i wykorzysuje je przy zapytaniach bez warunków, zastosujcie warunek WHERE i już nie bedzie takich różnic czasowych

    IP: 78.8.5.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

  • melkorm

    #6 melkorm® 2010-06-22 01:12:05 0

    "Jedną z metod zliczania liczby wierszy w tabeli jest użycie opcji SQL_CALC_FOUND_ROWS wraz z funkcją FOUND_ROWS()."

    Czy była by możliwość załączenia przy wynikach jeszcze  czasów z count + select (wybierający dane) i SQL_CALC_FOUND_ROWS + FOUND_ROWS() ?

    IP: 87.207.214.[...] Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.5.29 Version/10.60

  • Jacek_S

    #7 Jacek Smolak® 2010-06-22 09:45:06 0

    @m1chu - generalnie to co napisałem, to bym chętnie poczytał (na ten temat).

    Przykładowo: ostatnio znajomy administrator poprosił mnie o to, żebym z dość sporego zapytania SQL zdjął ORDER BY oraz LIMIT i przekazał to do PHP. Wynik nie był mały (w skrajnych przypadkach liczący kilka tysięcy rekordów), ale MySQL został odciążony i to w znacznym stopniu (oraz szybciej wykonało się zapytanie), przy małym, dodatkowym, obciążeniu PHP.

    Wczoraj trafiłem na taki temat: http://codingforums.com/showthread.php?t=183781

    Może przytoczę konkretny cytat:

    "I just created a MySQL DB with 10,000,000 records, as a test case. And

    I'm doing a range query (WHERE externalid = 777 AND timefield BETWEEN x

    AND y) and by making a composite key on (externalid, timefield) I was

    able to find a set of 60 matching records in roughly 1 millisecond. Yet

    if the composite key is reversed... (timefield, externalid) ... then

    the query takes 1000 times longer!!!!

    MySQL is *especially* sensitive to the order of fields in a key, so

    experiment, experiment, experiment. And don't forget about EXPLAIN."

    Także szerszy temat o wykorzystaniu indeksów bym prosił :)

    A od siebie jeszcze kilka linków:

    http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

    http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

    http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html

    Pozdrawiam!

    IP: 81.161.199.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)

  • Jacek_S

    #8 Jacek Smolak® 2010-06-22 09:51:22 0

    Przepraszam, za doubleposta.

    Dodatkowo można napisać chociaż ze dwa zdania (z przykładem) o lazy initialization.

    Pozdrawiam!

    IP: 81.161.199.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)

  • m1chu

    #9 m1chu® 2010-06-22 10:06:41 0

    @Czytacz:

    Bardziej życiowe przykłady pojawią się w kolejnych częściach. Te dwa (kompletnie wyimaginowane pod względem stopnia użyteczności) mają tylko pokazać osobom które nigdy o optymalizacji nie słyszały, gdzie może leżeć punkt zaczepienia w tym temacie. Nic po za tym, takie przygotowanie do kontynuacji, gdzie będzie o tym więcej i konkretniej.

    @melkorm:

    Te przykłady, w szerszej formie będą w części dotyczącej tego aspektu. Wtedy na pewno zamieszczę czasy, szersze tłumaczenia, itd.

    @Jacek S.:

    Dzięki bardzo za komentarz. Zabiorę go pod uwagę jak już będę "skrobał" :]

    IP: 85.221.146.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

  • beatnut

    #10 beatnut 2010-06-24 11:11:09 0

    Jeżeli chodzi o count(*) warto wspomnieć o dwóch rzeczach:

    1. Count(*) na tabeli myisam jest rzeczywiście szybkie przy zapytaniach bez klauzuli where ponieważ licznik rekordów jest przechowywany wewnętrznie i nie ma potrzeby skanowania tabeli.W każdym innym wypadku mysql i tak musi przeskanować tabele, ewentualnie uzyć indeksu.

    2. count(*) na tabeli innoDb działa znacznie wolniej od myisam

    IP: 79.188.1.[...] Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.60

  • ararar

    #11 ararar 2010-06-24 16:54:12 0

    a ja chętnie poczytam o wpływie  widoków (views) na szybkośc działania MySQL - wiele osób nie jest świadomych , że Mysql widoki mogą znacznie pogorszyć wydajność zapytań mysql. sam miałem okazję roic test aplikacji gdzie po usunięciu widoków zapytaia przyspieszyły kilkadziesiąt razy

    IP: 217.173.178.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 ( .NET CLR 3.5.30729)

  • beatnut

    #12 beatnut 2010-06-24 19:14:11 0

    Widoki szczególnie te z klauzulą  union są wolne ze względu na używanie tabeli tymczasowej ,poza tym w widokach nie jest wykorzystywany indeks

    IP: 193.93.91.[...] Opera/10.60 (X11; Linux x86_64; U; pl) Presto/2.6.30 Version/10.60

  • singollo

    #13 singollo 2010-06-25 11:03:14 0

    Jeśli nie wie się, czym są widoki to można być zaskoczonym ich wydajnością. A widok nie jest niczym innym jak aliasem na selecta, i zapytanie do widoku będzie działać pi razy drzwi jak zapytanie do podzapytania. Wiadomo, że w takim przypadku wszelkiego typu uniony, ordery itp wyrzucą wynik poza teorię relacyjną, więc dowolne indeksy przestaną działać.

    Bazy danych to dużo teorii, a dopiero później SQL-owe sztuczki.

    IP: 78.8.147.[...] Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 SUSE/5.0.372.0-1.1 (KHTML, like Gecko) Chrome/5.0.372.0 Safari/533.4

  • ararar

    #14 ararar 2010-06-25 14:17:31 0

    co do widoków to  ja mniej więcej wiem kiedy ich unikać i jak działają ale brakuje dobrych artykułów na ten temat porównująycyh  wydajnośc tej funkcji na różnych bazach danych i pułapek jakie czekają.

    pytam o to bo spotkałem się z osobami przyzyczajonymi do widoków z innych baz danych gdzie pewnie one sa materializowane jako osobne tabele i mają inne możliwości. tylko, że cięzko to przetłumaczyć takim osobom a miałem już okazję oglądać plikację gdzie widoki były nasepnie używane w zapytaniach typu JOIN z kolejnymi widokami , itp itd i działało to koszmarnie  wolno.

    co mnie zdziwiło to nie był pierwszy raz gyd spotykam programistów którzy chcąprzyspieszać działanie Mysql za pomocą używaia widoków

    IP: 217.173.178.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 ( .NET CLR 3.5.30729)

  • cojack

    #15 cojack 2010-07-05 18:15:56 0

    Nie wiem jak w mysqlu wyglądają widoki, i szczeże to mało mnie to obchodzi, ale w postgresql widok należy traktować jako interfejs do danych w bazie. Nic innego. Widok sam w sobie nie spowalnia działania zapytania, ale jak widok jest stworzony to już inna kwestia. także nie zgodzę sie z Tobą ararar.

    IP: 89.79.56.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6

  • singollo

    #16 singollo 2010-07-06 14:30:29 0

    Oczywiście, że dobrze napisane widoki są szybkie i sprawne. Ale na tym polega problem z widokami, że często nie wiesz, jak one są napisane. Źle napisany widok stworzy nieindeksowalną tabelę tymczasową, którą silnik będzie próbował złączyć z resztą zapytania - a to źle wróży całości.

    IP: 78.8.147.[...] Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9

  • lukasz89

    #17 lukasz89 2010-07-06 22:39:12 0

    A jest może jakiś program dzięki którmu mogę testować wydajność moich skryptów?

    IP: 83.7.179.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6

  • ararar

    #18 ararar 2010-07-07 07:16:41 0

    cojack, wlaśnie to jest bledem, że oceniasz widoki bez kontekstu w jakiej bazie danych sa uzywane i w jaki psosob sa potem uzywane :)

    widok "nie musi spowalniać" ale może i to jest właśnie problem, ze wiele osób tego nie zauważa, ze moze spowodowac to prace na nieindeksowanych danych

    IP: 217.173.178.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729)

Uwaga! Możesz zarejestrować się w serwisie i w ten sposób zarezerwować swój nick oraz ominąć konieczność ciągłego odczytywania wyrazów.

Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł