sql >> Database >  >> RDS >> Mysql

Hoe werken MySQL-weergaven?

Een weergave werkt als een tabel , maar het is geen tafel. Het bestaat nooit; het is alleen een voorbereide SQL-instructie die wordt uitgevoerd wanneer u naar de weergavenaam verwijst. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

...is gelijk aan hardlopen:

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

Een MySQLDump zal nooit rijen bevatten die in een weergave kunnen worden ingevoegd...

Dat is helaas door (zij het twijfelachtige) ontwerp. Er zijn talloze beperkingen voor MySQL-weergaven, die zijn gedocumenteerd:http://dev.mysql.com/doc/refman/5.0/en/create-view.html

Dus als het slechts een denkbeeldige tabel/voorbereide instructie is, betekent dit dan dat deze in theorie dezelfde prestatie (of zelfs minder) heeft als een normale tabel/query?

Nee.
Aan een tabel kunnen indexen zijn gekoppeld, waardoor gegevens sneller kunnen worden opgehaald (tegen enige kosten voor invoegen/bijwerken). Sommige databases ondersteunen "gematerialiseerde" weergaven, dit zijn weergaven waarop indexen kunnen worden toegepast - wat geen verrassing zou moeten zijn dat MySQL niet ondersteunt gezien de beperkte weergavefunctionaliteit (die pas in v5 IIRC begon, erg laat in het spel).

Omdat een weergave een afgeleide tabel is, zijn de prestaties van de weergave slechts zo goed als de query waarop deze is gebaseerd. Als die query slecht is, zal het prestatieprobleem gewoon sneeuwballen ... Dat gezegd hebbende, bij het opvragen van een weergave - als een weergavekolomverwijzing in de WHERE-component niet in een functie is verpakt (IE:WHERE v.column LIKE ... , niet WHERE LOWER(t.column) LIKE ... ), kan de optimizer de criteria (een predikaat genoemd) naar de oorspronkelijke query pushen, waardoor deze sneller wordt.



  1. PostgreSQL Connection Pooling:Part 3 – Pgpool-II

  2. Wat is de beste werkwijze om specifieke pagina's te beperken tot alleen ingelogde gebruikers in Codeigniter?

  3. Tellen op basis van voorwaarde in SQL Server

  4. Wat is in een Oracle-database het verschil tussen ROWNUM en ROW_NUMBER?