sql >> Databáze >  >> RDS >> Mysql

Jak fungují pohledy MySQL?

Pohled funguje jako tabulka , ale není to stůl. Nikdy neexistuje; je to pouze připravený příkaz SQL, který se spustí, když odkazujete na název pohledu. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

...je ekvivalentní běhu:

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

MySQLDump nikdy nebude obsahovat řádky, které se mají vložit do pohledu...

To je bohužel podle (i když sporného) designu. Pro zobrazení MySQL existuje řada omezení, která jsou zdokumentována:http://dev.mysql.com/doc/refman/5.0/en/create-view.html

Pokud je to tedy pouze imaginární tabulka/připravený příkaz, znamená to, že má teoreticky stejný výkon (nebo dokonce nižší) jako normální tabulka/dotaz?

Ne.
Tabulka může mít přidružené indexy, což může urychlit načítání dat (za určitou cenu vložení/aktualizace). Některé databáze podporují „materializované“ pohledy, což jsou pohledy, na které lze použít indexy – což by nemělo být překvapením, že MySQL nepodporuje vzhledem k omezené funkčnosti zobrazení (která začala až ve verzi 5 IIRC, velmi pozdě do hry).

Vzhledem k tomu, že pohled je odvozená tabulka, výkon pohledu je pouze tak dobrý, jako je dobrý dotaz, na kterém je postaven. Pokud je tento dotaz na hovno, problém s výkonem bude jen sněhová koule... To znamená, že při dotazu na pohled - pokud odkaz na sloupec pohledu v klauzuli WHERE není zabalen do funkce (IE:WHERE v.column LIKE ... , ne WHERE LOWER(t.column) LIKE ... ), může optimalizátor vložit kritéria (nazývaná predikát) do původního dotazu, čímž jej urychlí.



  1. Doctrine 2 DQL MySQL ekvivalentní ROUND()?

  2. Migrace z Maxscale na ProxySQL Load Balancer

  3. Efektivní strategie pro zanechání auditní stopy/historie změn pro DB aplikace?

  4. Backtrace z SQL dotazu do kódu aplikace?