Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak działają widoki MySQL?

Widok działa jak tabela , ale to nie jest stół. Nigdy nie istnieje; jest to tylko przygotowana instrukcja SQL, która jest uruchamiana podczas odwoływania się do nazwy widoku. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

...jest równoznaczne z uruchomieniem:

SELECT x.* 
  FROM (SELECT * FROM bar) x

MySQLDump nigdy nie będzie zawierał wierszy do wstawienia do widoku...

Jest to, niestety, z (choć wątpliwe) zamierzone. Istnieje wiele ograniczeń dla widoków MySQL, które są udokumentowane:http://dev.mysql.com/doc/refman/5.0/en/create-view.html

Więc jeśli jest to tylko wyimaginowana tabela/przygotowana instrukcja, czy oznacza to, że teoretycznie ma taką samą wydajność (lub nawet niższą) jak normalna tabela/zapytanie?

Nie.
Tabela może mieć powiązane indeksy, co może przyspieszyć pobieranie danych (za pewnymi kosztami wstawiania/aktualizacji). Niektóre bazy danych obsługują widoki „zmaterializowane”, czyli widoki, do których można zastosować indeksy – co nie powinno być niespodzianką, że MySQL nie obsługuje biorąc pod uwagę ograniczoną funkcjonalność widoku (która rozpoczęła się dopiero w wersji 5 IIRC, bardzo późno).

Ponieważ widok jest tabelą pochodną, ​​wydajność widoku jest tak dobra, jak zapytanie, na którym jest zbudowany. Jeśli to zapytanie jest do niczego, problem z wydajnością będzie po prostu kulą śniegową... To powiedziawszy, podczas wykonywania zapytania dotyczącego widoku - jeśli odwołanie do kolumny widoku w klauzuli WHERE nie jest opakowane w funkcję (IE:WHERE v.column LIKE ... , nie WHERE LOWER(t.column) LIKE ... ), optymalizator może przesunąć kryteria (nazywane predykatem) do oryginalnego zapytania - przyspieszając je.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie MySQL uwzględniające wielkość liter

  2. jak używać mysql_data_seek z PDO?

  3. php usuwa wiersze linków z bazy danych mysql

  4. Jak w złączeniu poprzedzić wszystkie nazwy kolumn tabelą, z której pochodzi?

  5. MySQL pobiera datę sprzed n dni jako znacznik czasu