2013-05-22 9 views
14

Jestem niezmiernie nowym użytkownikiem, więc proszę, wybacz mi, jeśli to głupie pytanie, ale mam widok, który jest bardzo pomocny w optymalizacji dość nieporęcznego zapytania i pozwala mi wybrać w stosunku do małego podzbioru kolumn w widoku. miałem jednak nadzieję, że Widok będzie gdzieś przechowywany, więc wybór przeciwko nie zajęłby wiele czasu.Czy istnieje sposób przechowania pamięci podręcznej widoku, aby zapytania na jego temat były szybkie?

Mogę się mylić, ale mam wrażenie (z szybkości, z jaką wykonuje się create view i od czasu trwania moich zapytań na mój widok), że Widok faktycznie jest uruchamiany jako zapytanie przed zapytaniem zewnętrznym, za każdym razem Wybieram przeciwko niemu.

Naprawdę mam nadzieję, że przeoczyłem jakiś mechanizm, w którym po uruchomieniu CREATE VIEW może wykonać ciężką pracę z kwerendy View *, tak, że moje kolejne wybieranie przeciwko tego statycznego widoku byłoby naprawdę szybkie.

BTW, całkowicie rozumiem, że oczywiście ten WIDOK będzie migawką danych, które istniały w momencie utworzenia WIDOKU i nie odzwierciedlają żadnych nowych informacji, które zostały wstawione/zaktualizowane po utworzeniu WIDOKU. Dokładnie to, czego potrzebuję.

TIA

+0

Więc to, czego chcesz, to zmaterializowany widok, a nie widok, który dostarcza mysql, który jest tylko aliasem dla ogromnego zapytania. Począwszy od mysql 5.1, zapytania SELECT względem widoku są buforowane, dlatego wszelkie kolejne zapytania powinny być szybkie. Jak dokładnie coś tu nie działa? Czy używasz podzapytań w zapytaniach tworzących widok? –

+0

Używam ogromnej kwerendy z wieloma subselects w moim VIEW, i nie wydaje się być w ogóle buforowania. Jako dowód koncepcji nazwałem po prostu 'select count (id) z myView', co, jak przypuszczam, powinno być całkiem zgryźliwe, jeśli wynik myView został zbuforowany, ale niestety trwa to tak samo długo, jak każde inne zapytanie przeciwko niemu. Czy problem dotyczy wyboru Mojego widoku? (Nie jestem pewien, czy to masz na myśli podzapytania lub czy istnieje rozróżnienie). –

+0

Subselect lub podzapytanie - więc mówimy o tym samym. MySQL używa własnej pamięci podręcznej zapytań.Powiedzmy, że mamy tabelę z 1 milimilem wierszy, wyszukujesz ją jak 'select count (*)' - pierwszy raz będzie powolny, drugi raz będzie natychmiastowy, ponieważ pobierze buforowane dane. Ta sama reguła dotyczy widoków, z tą różnicą, że MySQL nie buforuje wyników podselekcji. Wszystko to oznacza, że ​​wynik uzyskany z widoku * nie będzie buforowany wewnętrznie * przez MySQL, jeśli masz podselekty. Dlatego zawsze będzie uruchamiał zapytania od zera, jeśli zechcesz. I dlatego twój widok będzie powolny. –

Odpowiedz

12

Co chcesz zrobić, to urzeczywistnić swój pogląd. Spójrz na http://www.fromdual.com/mysql-materialized-views.

+0

hmm ... dobrze na podstawie tego tutoriala wygląda jak w mySQL Materializujące widoki to trochę summersault. Miałem nadzieję, że będzie to tak proste, jak dodanie słowa kluczowego do mojego widoku. No cóż ... dziękuję za poinformowanie mnie, jak się nazywa! :) –

+0

@ Dr.Dredel: zawsze można przejść do DB2, gdzie taka bestia jest możliwa po prostu przez dodanie jednego słowa. Nie możesz jednak wziąć pod uwagę kosztu takiego :-) – paxdiablo

+0

Niestety nie jest to obecnie opcja dla nas :) –

2

To, o czym mówisz, to zmaterializowane widoki, funkcja (przynajmniej) DB2, ale nie MySQL, o ile wiem.

Istnieją sposoby na to, aby emulować je, tworząc okresowo lub wypełniając tabelę, lub na żądanie, ale prawdziwy zmaterializowany widok wie, kiedy dane bazowe uległy zmianie, a jedynie ponownie oblicza, jeśli jest to wymagane.

Jeśli dane nie ulegną zmianie po utworzeniu widoku (jak się wydaje w komentarzu), po prostu stwórz zupełnie nową tabelę, która będzie przechowywać podzbiór danych i zapytaj o numer . Ludzie zawsze narzekają na powolną, ale rzadko o wymogi przechowywania danych :-)

+0

Jak na ironię, naprawdę nie chcę, aby buforowana tabela kiedykolwiek się zmieniała. Robię rzeczy takie jak 'select * gdzie data pomiędzy x i y' tak, moja buforowana tabela reprezentuje stały zestaw danych, które nie będą się wcale przesuwać. Chcę tylko móc szybko wybrać przeciwko tym danym. –

0

Ponieważ widok jest po prostu SELECT stwierdzenie można użyć query cache celu zwiększenia wydajności.

Ale najpierw należy sprawdzić, czy:

  • można dodać indeksów w tabelach zaangażowanych przyspieszyć zapytanie (użyj EXPLAIN)
  • dane nie zmienia się bardzo często można urzeczywistnić pogląd (rób zdjęcia)
Powiązane problemy