MySql views performance [zamknięty]

Jeśli idziesz drogą korzystania z widoków, jak możesz zapewnić dobrą wydajność?

A może lepiej nie używać widoków w pierwszej kolejności i po prostu włączać odpowiedniki do instrukcji select?

Author: Somnath Muluk, 2012-04-24

6 answers

To Zależy.

To całkowicie zależy od tego, co oglądasz przez Widok. Ale najprawdopodobniej zmniejszenie wysiłku i daje wyższą wydajność. Gdy polecenie SQL odwołuje się do nieindeksowanego widoku, parser i optymalizator zapytań analizują źródło zarówno instrukcji SQL, jak i widoku, a następnie rozwiązują je w jeden plan wykonania. Nie ma jednego planu dla instrukcji SQL i oddzielnego planu dla widoku.

Widok nie jest kompilowany . Jego wirtualny stół składa się innych tabel. Kiedy go utworzysz, nie znajduje się gdzieś na twoim serwerze. Podstawowe zapytania tworzące widok podlegają takim samym wzrostom wydajności lub spadkom wydajności optymalizatora zapytań. Nigdy nie testowałem wydajności na widoku VS jego podstawowe zapytanie, ale wyobrażam sobie, że wydajność może się nieznacznie różnić. Możesz uzyskać lepszą wydajność w widoku indeksowanym, jeśli dane są stosunkowo statyczne. To może być to, co myślisz może w kategoriach "skompilowany".

Zalety odsłon:

  1. wyświetl dane bez zapisywania danych do obiektu.
  2. Restict widok tabeli tzn. może ukryć niektóre kolumny w tabelach.
  3. połącz dwie lub więcej tabel i pokaż je użytkownikowi jako jeden obiekt.
  4. Ogranicz dostęp do tabeli, aby nikt nie mógł wstawiać wierszy do tabeli.

Zobacz te przydatne linki:

  1. wydajność widoku a polecenie SQL
  2. czy widok jest szybszy od prostego pytanie?
  3. Mysql VIEWS vs. PHP query
  4. czy widoki MySql są dynamiczne i wydajne?
  5. zmaterializowany Widok A tabele: jakie są zalety?
  6. czy odpytywanie o widok jest wolniejsze niż wykonywanie SQL bezpośrednio?
  7. obejście problemów wydajności kuszących poglądów
  8. Zobacz wzrost wydajności za pomocą zindeksowanych widoków w SQL Server
 86
Author: Somnath Muluk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:23

Myślę, że blog Petera Zaitseva ma większość szczegółów. Mówienie z osobistych doświadczeń widoki mogą działać dobrze, jeśli ogólnie zachować je proste. U jednego z moich klientów układali jeden widok na drugi i skończyło się to koszmarem perfomancji.

Ogólnie używam widoków, aby pokazać inny aspekt tabeli. Na przykład w tabeli moi pracownicy Pokaż mi menedżerów lub ukryj pole wynagrodzenia przed pracownikami spoza HR. Również zawsze upewnij się, że uruchomisz Wyjaśnienie na zapytanie i widok, aby dokładnie zrozumieć, co dzieje się w MySQL.

Jeśli chcesz solidnego dowodu w swoim scenariuszu, sugeruję, abyś przetestował. Naprawdę trudno powiedzieć, że używanie widoków jest zawsze zabójcą wydajności, a źle napisany widok prawdopodobnie zabije Twoją wydajność.

 7
Author: Namphibian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-27 07:56:19

Służą swojemu celowi, ale ukryte zawiłości i nieefektywności zwykle przeważają nad bardziej bezpośrednim podejściem. Kiedyś spotkałem się z instrukcją SQL, która łączyła dwa widoki i sortowała je po wynikach. Widoki również były sortowane, więc czas wykonania mógł być mierzony w godzinach.

 6
Author: GDP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 16:45:06

Oto TL; DR podsumowanie, można znaleźć szczegółowe oceny z Peter Zaitsev i gdzie indziej.

Widoki w MySQL to generalnie zły pomysł. W Grooveshark uważamy je za szkodliwe i zawsze ich unikamy. Jeśli jesteś ostrożny, możesz sprawić, że będą działać, ale w najlepszym razie będą one sposobem na zapamiętanie, jak wybrać dane lub uchronić Cię przed ponownym wpisywaniem skomplikowanych połączeń. W najgorszym przypadku mogą powodować ogromne nieefektywności, ukrywać złożoność, powodować przypadkowe zagnieżdżanie się podzbiorów (wymagających tymczasowego tabel i prowadzące do rozbijania dysków), itp.

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

 5
Author: Jay Paroline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 05:48:30

Jeśli mówimy "jeśli używamy widoków, jak zapewnić wydajność", a nie efekt wydajności widoków w ogóle, myślę, że sprowadza się to do powściągliwości (jak w sobie).

Możesz mieć duże kłopoty, jeśli po prostu piszesz widoki, aby Twoje zapytanie było proste we wszystkich przypadkach, ale nie dbaj o to, aby Twoje widoki były rzeczywiście przydatne pod względem wydajności. Każde zapytanie, które robisz na końcu, powinno działać zdrowo (zobacz przykład komentarza z tego linku autorstwa @ eggyal). Oczywiście, że to tautologia, ale nie mniej wartościowa

Należy szczególnie uważać, aby nie tworzyć widoków z widoków, tylko dlatego, że może to ułatwić tworzenie tego widoku.

W końcu 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żesz być lepszy z procedurą składowaną IMHO.

Aby mieć wszystko pod kontrolą, możesz zapisać, dlaczego masz określony widok i zdecydować, dlaczego używasz to. Dla każdego "nowego" użycia w programie, sprawdź ponownie, czy rzeczywiście potrzebujesz widoku, dlaczego go potrzebujesz i czy to nadal dałoby ci rozsądną ścieżkę wykonania. Keep on checking your uses to keep it speedy, and keep checking if you really need that view.

 3
Author: Nanne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-27 08:00:44

Rzecz dotychczas nie wymieniona, ale robiąca ogromną różnicę jest odpowiednie indeksowanie widoków " Źródło tabele .

Jak wspomniano powyżej, widoki Nie rezydują w Twoim DB , ale są odbudowywane za każdym razem. W ten sposób wszystko, co ułatwia odbudowę DB, zwiększa wydajność widoku.

Często widoki łączą dane w sposób, który jest bardzo zły dla przechowywania (brak normalnej formy), ale bardzo dobry do dalszego wykorzystania (Robienie analizy, prezentowanie danych do użytkownik, ...), a tym samym łączenie i agregowanie danych z różnych tabel.

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

! Indeks wszystkich użytych kolumn in JOINS and GROUP BY clauses in your CREATE VIEW statement !

 3
Author: petermeissner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 12:49:16