sql >> Database teknologi >  >> RDS >> Mysql

Hvordan fungerer MySQL-visninger?

En visning fungerer som en tabel , men det er ikke et bord. Det eksisterer aldrig; det er kun en forberedt SQL-sætning, der køres, når du refererer til visningsnavnet. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

... svarer til at køre:

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

En MySQLDump vil aldrig indeholde rækker, der skal indsættes i en visning...

Det er desværre af (omend tvivlsomt) design. Der er adskillige begrænsninger for MySQL-visninger, som er dokumenteret:http://dev.mysql.com/doc/refman/5.0/en/create-view.html

Så hvis det kun er en imaginær tabel/forberedt sætning, betyder det så, at den teoretisk har den samme ydeevne (eller endnu mindre) som en normal tabel/forespørgsel?

Nej.
En tabel kan have indekser tilknyttet, hvilket kan gøre datahentning hurtigere (mod en vis pris for indsættelse/opdatering). Nogle databaser understøtter "materialiserede" visninger, som er visninger, der kan have indekser anvendt på dem - hvilket ikke burde være en overraskelse, at MySQL ikke understøtter givet den begrænsede visningsfunktionalitet (som først begyndte i v5 IIRC, meget sent i spillet).

Fordi en visning er en afledt tabel, er visningens ydeevne kun så god som den forespørgsel, den er bygget på. Hvis den forespørgsel stinker, vil ydeevneproblemet bare snebold... Når det er sagt, når der forespørges på en visning - hvis en visningskolonnereference i WHERE-sætningen ikke er pakket ind i en funktion (Dvs.:WHERE v.column LIKE ... , ikke WHERE LOWER(t.column) LIKE ... ), kan optimeringsværktøjet skubbe kriterierne (kaldet et prædikat) til den oprindelige forespørgsel - hvilket gør det hurtigere.



  1. Opdel kommaseparerede værdier til kolonner i Oracle

  2. Langsom forespørgsel ved brug af BESTIL EFTER

  3. jqGrid - Unikt ID for ny række

  4. Homebrew postgres knækket