Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wydajność widoków
Forum PHP.pl > Forum > Bazy danych > MySQL
athabus
Witam,

Piszę właśnie nowy projekt, a że na serwerze roboczym mam dostęp do mysql 5 to zacząłem się poważnie zastanawiać nad użyciem widoków.

Generalnie wiem do czegą służą i jak ich używać - pracowałem już z widokami na PG, ale jedna rzecz nie daje mi spokoju - czy widoki są wydajne. Kiedyś gdzieś czytałem, że widok działa w ten sposób, że po prostu przed wykonaniem zapytania na widoku zostje wywołane zapytanie tworzące ten widok. Zakładam, że jest to duże uproszczenie i w grę wchodzi jakieś cachowanie itp. Bo gdyby tak było jak napisałem, to widoki nie byłyby zbyt wydajne - łączenie całych tabel by odczytać wynik jakiegos prościutkiego zapytania - koszmarek.

Zatem może ktoś się orientuje jak wygląda z efektywnością wykorzystywania widoków - czy warto z nich korzystać i jak to w ogóle działa (w sensie od podszewki) - czy są jakieś ogólne zasady kiedy warto używać widoków, a kiedy tego nie robić.

edit - może lepszym miejscem byłoby ogólen forum baz danych bo wprawdzie pytam o MySql, ale widoki to bardziej ogólen pojęcie.
SongoQ
W MySQL widoki to nowosc jeszcze nie jest "doszlifowane" jak powinno. Co do sensu stosowania to trudno pisac (mniejszy kod idzie do serwera bazy danych, mozesz wykorzystywac wiele razy). W ostatnim projekcie w ktorym bralem udzial probowalem zrobic taki typowy ORM w polaczeniu z widokami. Byly miejsca ze wydajnosc napewno nie byla kluczowa sprawa. Widoki warto stosowac rowniez kiedy kod aplikacji mamy zamkniety a potrzeba jest dostrojenia jakiegos zapytania. Jesli juz takie cos robimy to z najlepiej aby bylo jak namjniej zlaczen do widokow bo wtedy mamy wieksza kontrole utrzymania wydajnosci jednego widoku a nie widokow rekurencyjnych.

Co do dzialania. To widoki w MySQLu dzialaja narazie w 1 okreslony sposob, traktowane sa jak wynik zbiorow i zapytanie do nich odbywa sie na zbiorze danych. Narazie chyba tylko w Oracle jest mozliwosc laczenia widoku z warunkiem.
Odnosnie exekucji takiego widoku to na pewno zysk jest na tym ze za kazdym razem kod SQLa widoku nie jest walidowany (odbywa sie to za pierwszym razem) i pomijane sa operacje ze sprawdzaniem poprawnosci pol, tabel, typow pol itd. Co do cache to nie mam pojecia jak to zrobili. W dokumentacji powinno byc cos na ten tamat.

Sa jeszcze widoki (perspektywy) zmaterializowane gdzie tworzony jest w pamieci zbior wynikow takiego zapytania widoku ale w mysqlu nie slyszalem o czyms takim. Polecam poczytac oficjalne forum mysqla.
athabus
dzięki za info. Tu już mi daję troche oglądu.
SongoQ
Jak cos "ciekawego" znajdziesz, wywnioskujesz to smialo pisz na forum.
athabus
Trochę poczytałem na forum mySql i wnioski są takie:
- widoki w przypadku prostych zapytań wykonywanych na widoku nie obniżają wydajności bazy - plusem jest tu oczywiście uproszczenie dostępu do danych. Kilka osób skrażyło się jednak, że przy bardziej skomplikowanych zapytaniach na widoku mySql ma tendencję do spadku efektywności w stosunku do porównywalnego zapytania dla wielu tabel.

- rozmawiałem też z osobą która ma MCP z MSSQL i na tej bazie polecają robienie widoków - wynika to ze specyfiki tego silnika - tam widoki w większości przypadków (mowa o najnowszym serwerze) dają wzrost wydajności blink.gif . Szczególnie dobre rezultaty dają widoki tworzone dla złożeń z wielu tabel, na których są zakładane klucze pod kontem konkretnych zapytań. Nie wiem jednak jak to wygląda w mySql.

- ta sama osoba, mówiła, że jednak procedury i tak są wydajniejsze od widoków, także w optymalizacji jeszcze lepiej stosować procedury (ale to raczej było do przewidzenia).

Wniosek ogólny - w mysql raczej widoki powodują obniżenie wydajności (choć może zdarzyć sie konkretna sytuacja w której widok może poprawić wydajność - na formu znalazłem opinię osoby, która twierdzi, że w przypadku algorytmu TempTable może zwiększyć się wydajność). Plusem jest tu napewno to, że wbrew moim pierwotnym przypuszczeniom działanie widoków w mysql daje relatywnie mały spadek wydajności przy prostych zapytaniach kierowanych do widoku. Generalnie przeważa jednak opinia, że widoki warto stosować dla "klarowności" kodu/dostępu do danych - jeśli kluczowa jest wydajność lepiej zrezygnować z widoków (i stosować procedury).

Zaciekawiła mnie sprawa MSSQL i wydajności widoków - no ale to zupełnie inna klasa bazy danych.

Wniosek końcowy - widoki mysql mają 2 algorytmy tworzenia i wiele opcji dodatkowych - przy umiejętnym stosowaniu spadek wydajności może być znikomy - ewentualnie może być nawet mały wzrost wydajności w sprzyjających warunkach - trzeba więc dobrze wiedzieć co się robi. A myślałem, że widoki są proste biggrin.gif

* wszystko powyżej to rozważania teoretyczne nie poparte żadnym doświadczeniem w tej kwesti z mojej strony więc mogą to być po prostu wierutne bzdury biggrin.gif
zorobabel
Pozwolę sobie odgrzać kotleta. Od założenia tematu minęło trochę czasu, ale myślę, że problem nadal aktualny.
Obecnie pracuję nad sporą bazą do której dostęp dla Kowalskiego realizowany jest przez interfejs napisany głównie w PHP. Projekt jest dość rozbudowany, więc i pisania sporo. Jak dla mnie koszt niewielkiego spadku wydajności jest naprawdę niewielką ceną za olbrzymie uproszczenie kodu po stronie PHP.
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.