2012-04-24 12 views
51

Jeżeli zamierzasz korzystać z widoków, w jaki sposób zapewnić dobre wyniki?MySql wyś wietla wydajność

A może to nie lepiej użyć widoki w pierwszej kolejności i po prostu włączyć równowartość do swoich wybranych stwierdzeń?

+5

Znalazłem [ten artykuł na blogu] (http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/) autorstwa Petera Zaitseva, który był dość pouczający w przeszłości. – eggyal

+0

@eggyal - Dzięki, będzie czytać i myśleć –

+0

Sprawdź również ostatnie ** [MariaDB 5.3] (http://kb.askmonty.org/en/what-is-mariadb-53) ** (i 5.5), które mają kilka ulepszeń w optymalizatorze, w tym w widokach. –

Odpowiedz

79

To zależy.

To całkowicie zależy od tego, co oglądasz w widoku. Ale najprawdopodobniej zmniejszając wysiłek i dając wyższą wydajność. Gdy instrukcja SQL odwołuje się do nieindeksowanego widoku, optymalizator analizatora składni i zapytań analizuje źródło zarówno instrukcji SQL, jak i widoku, a następnie dzieli je na jeden plan wykonania. Nie ma jednego planu dla instrukcji SQL i oddzielnego planu dla widoku.

Widok nie został skompilowany. Jest to wirtualny stół złożony z innych stołów. Kiedy go tworzysz, nie znajduje się gdzieś na twoim serwerze. Podstawowe zapytania tworzące widok podlegają takim samym wzrostom wydajności lub spadkom optymalizatora zapytań. Nigdy nie testowałem wydajności w widoku VS z jego bazowym zapytaniem, ale wyobrażam sobie, że wydajność może się nieznacznie różnić. Możesz uzyskać lepszą wydajność w indeksowanym widoku, jeśli dane są stosunkowo statyczne. Być może to, co myślisz, może być "skompilowane".

Zalety wyświetleń:

  1. Zobacz dane bez zapisywania danych do obiektu.
  2. Restrykcja widoku tabeli, np. Może ukryć niektóre kolumny w tabelach.
  3. Połączyć dwie lub więcej tabel i pokazać je jako jeden obiekt użytkownikowi.
  4. Należy ograniczyć dostęp do stołu, aby nikt nie mógł wstawiać wierszy do tabeli.

Zobacz te przydatne linki:

  1. Performance of VIEW vs. SQL statement
  2. Is a view faster than a simple query?
  3. Mysql VIEWS vs. PHP query
  4. Are MySql Views Dynamic and Efficient?
  5. Materialized View vs. Tables: What are the advantages?
  6. Is querying over a view slower than executing SQL directly?
  7. A workaround for the performance problems of TEMPTABLE views
  8. See performance gains by using indexed views in SQL Server
+1

Wspominasz widoki indeksowane i masz kilka linków do artykułów indeksowanych i zmaterializowanych widoków. Wszystko jest w porządku i dobrze. Ale czy MySQL ma indeksowane widoki? –

+4

Brak obecnie MySQL nie obsługuje widoków indeksowanych. –

+2

Dobra odpowiedź. Dodam tylko, że widok jest w zasadzie nazwanym zapytaniem w MySQL. Jeśli upewnisz się, że zapytanie generujące widok ma dobrą wydajność po uruchomieniu przez niego, widok powinien działać podobnie. –

6

Myślę, że blog Petera Zaitseva zawiera większość szczegółów. Mówienie z osobistych widoków może przynosić dobre wyniki, jeśli ogólnie je utrzymasz. U jednego z moich klientów ustawiali jeden widok na drugim, a skończyło się to na koszmarnym występie.

Ogólnie używam widoków, aby pokazać inny aspekt stołu. Na przykład w tabeli moich pracowników pokażcie mi menedżerów lub ukryjcie pole wynagrodzeń od pracowników niezwiązanych z HR. Zawsze upewnij się, że uruchomiłeś EXPLAIN w zapytaniu i wyświetliłeś, aby dokładnie zrozumieć, co dzieje się w MySQL.

Jeśli potrzebujesz solidnego dowodu w swoim scenariuszu, sugerowałbym przetestowanie. Naprawdę trudno powiedzieć, że używanie widoków jest zawsze mordercą wydajności, a następnie źle napisany widok prawdopodobnie zabije twoją wydajność.

3

Jeśli mówimy "jeśli korzystasz z poglądów, jak zapewnić wydajność", a nie efekt działania wyświetleń w ogóle, myślę, że sprowadza się to do ograniczenia (jak w sobie).

można dostać się do dużych kłopotów, jeśli tylko pisać widoki, aby zapytanie proste we wszystkich przypadkach, ale nie dbać, że Twoje poglądy są rzeczywiście przydatne wydajność mądry. Wszelkie zapytania, które robisz na końcu, powinny działać poprawnie (zobacz przykład komentarza z tego linku autorstwa @eggyal). Oczywiście jest to tautologia, ale nie mniej wartościowa. Szczególnie musisz zachować ostrożność, aby nie wyświetlać widoków z widoków, tylko dlatego, że może to ułatwić tworzenie tego widoku.

Na koniec musisz spojrzeć na powód, dla którego używasz widoków. Za każdym razem, gdy robisz to, aby ułatwić życie na końcu programowania, może być lepiej z IMHO przechowywanej procedury.

Aby utrzymać wszystko pod kontrolą, może chcesz napisać dlaczego masz pewien pogląd, i zdecydować, dlaczego używasz go. Dla każdego "nowego" użycia w swoim programowaniu, sprawdź ponownie, czy rzeczywiście potrzebujesz widoku, dlaczego go potrzebujesz i czy to nadal dałoby ci rozsądną ścieżkę realizacji. Kontynuuj sprawdzanie swoich zastosowań, aby było szybkie i sprawdzaj, czy naprawdę potrzebujesz tego widoku.

4

Oto podsumowanie tl; dr, można znaleźć szczegółowe oceny od Piotra Zajcewa i gdzie indziej.

Widoki w MySQL są generalnie złym pomysłem. W Grooveshark uważamy je za szkodliwe i zawsze ich unikamy. Jeśli zachowasz ostrożność, możesz sprawić, by działały, ale w najlepszym razie są sposobem na zapamiętanie, jak wybrać dane lub uniemożliwić ponowne wpisywanie skomplikowanych połączeń. W najgorszym wypadku może to spowodować ogromne nieefektywności, ukryć złożoność, spowodować przypadkowe zagnieżdżone obsługę żądań (wymagające tabel tymczasowych i prowadzi do bicia na dysku), itp

Najlepiej po prostu ich unikać, i zachować swoje zapytania w kodzie.

+1

Chciałbym zobaczyć ten komentarz przed moim zespołem i umieścić te wszystkie widoki z dużą ilością złączeń w naszej bazie danych produkcji:/ – Ralph

6

Służą one swoje zadanie, ale ukryte zawiłości i niewydolnych zwykle przeważają bardziej bezpośrednie podejście. Kiedyś napotkałem instrukcję SQL, która łączyła się w dwóch widokach i sortowała je. Widoki również się sortowały, więc czas wykonania mógł być mierzony w godzinach, które wydawały się godzinami.

3

Rzecz nie wspomniano tak daleko, ale czyni ogromną różnicę jest odpowiednie indeksowanie źródła poglądów tabele.

Jak wspomniano powyżej, poglądy nie mieszkają w DB ale odbudować każdym razem. W ten sposób wszystko, co ułatwia odbudowę bazy danych, zwiększa wydajność widoku.

Często widoki łączą dane w sposób, który jest bardzo szkodliwy dla przechowywania (brak normalnej formy), ale bardzo dobry do dalszego wykorzystania (analiza, prezentowanie danych użytkownikowi, ...) i łączenie i agregowanie danych z różnych tabele.

To, czy kolumny, w których wykonywane są operacje, są indeksowane, czy nie, ma ogromne znaczenie dla wydajności widoku. Jeśli tabele i odpowiednie kolumny są indeksowane, dostęp do widoku nie kończy się ponownym obliczeniem indeksów najpierw.(z drugiej strony jest to wykonywane, gdy dane są przetwarzane w tabelach źródłowych)

! Indeksuj wszystkie kolumny używane w klauzulach JOINS i GROUP BY w instrukcji CREATE VIEW!

Powiązane problemy