Quando utilizzare le visualizzazioni in MySQL?


54

Quando si creano tabelle da più join da utilizzare nell'analisi, quando si preferisce utilizzare le viste anziché creare una nuova tabella?

Uno dei motivi per cui preferirei utilizzare le viste è che lo schema del database è stato sviluppato dal nostro amministratore all'interno di Ruby e non ho familiarità con Ruby. Posso richiedere la creazione di tabelle, ma richiede un passaggio aggiuntivo e vorrei maggiore flessibilità durante lo sviluppo / test di nuovi join.

Ho iniziato a utilizzare le visualizzazioni seguendo la risposta a una domanda correlata su SO ( Quando utilizzare R, quando utilizzare SQL ). La risposta più votata inizia "esegui le manipolazioni dei dati in SQL fino a quando i dati non si trovano in una singola tabella, quindi fai il resto in R."

Ho iniziato a utilizzare le visualizzazioni, ma ho riscontrato alcuni problemi con le visualizzazioni:

  1. le query sono molto più lente
  2. Le viste non vengono trasferite dalla produzione al database di backup che utilizzo per l'analisi.

Le viste sono appropriate per questo uso? In tal caso, dovrei aspettarmi una penalità per le prestazioni? C'è un modo per accelerare le query sulle visualizzazioni?


Sembra che le viste siano appropriate qui, ma non sono sicuro di cosa potrebbe causare il rallentamento durante la query.
FrustratedWithFormsDesigner l'

@FrustratedWithFormsDesigner ci sono dei programmi diagnostici che potrebbero aiutare (a parte creare un esempio riproducibile)? La stessa query complessa richiede <4 secondi se eseguita direttamente su tabelle unite e> 25 secondi quando eseguita su viste. Le visualizzazioni non prevedono una penalità per le prestazioni?
David LeBauer,

È passato molto tempo da quando ho usato MySQL, quindi non posso davvero dirlo.
FrustratedWithFormsDesigner,

Uso MySQL e ti dirò che le visualizzazioni sono terribili, inutilizzabili quando arrivi a 100K e oltre, basta usare query dirette in cui hai il controllo su quali campi restituire e quali join utilizzare
Stephen Senkomago Musoke

Risposte:


43

Le viste in MySQL sono gestite usando uno di due diversi algoritmi: MERGEo TEMPTABLE. MERGEè semplicemente un'espansione della query con alias appropriati. TEMPTABLEè proprio quello che sembra, la vista inserisce i risultati in una tabella temporanea prima di eseguire la clausola WHERE e non ci sono indici su di essa.

L'opzione 'terza' è UNDEFINED, che dice a MySQL di selezionare l'algoritmo appropriato. MySQL tenterà di utilizzare MERGEperché è più efficiente. Avvertenza principale:

Se non è possibile utilizzare l'algoritmo MERGE, è necessario utilizzare una tabella temporanea. MERGE non può essere utilizzato se la vista contiene uno dei seguenti costrutti:

  • Funzioni aggregate (SUM (), MIN (), MAX (), COUNT () e così via)

  • DISTINCT

  • RAGGRUPPARE PER

  • VISTA

  • LIMITE

  • UNION o UNION ALL

  • Sottoquery nell'elenco di selezione

  • Si riferisce solo ai valori letterali (in questo caso, non esiste una tabella sottostante)

[Fonte]

Mi azzarderei a indovinare che le VOSTRE VISTE richiedono l'algoritmo TEMPTABLE, causando problemi di prestazioni.

Ecco un post sul blog molto vecchio sulle prestazioni delle visualizzazioni in MySQL e non sembra essere migliorato.

Tuttavia, potrebbe esserci un po 'di luce alla fine del tunnel su questo problema di tabelle temporanee che non contengono indici (causando scansioni di tabelle complete). In 5.6 :

Nei casi in cui è richiesta la materializzazione per una sottoquery nella clausola FROM, l'ottimizzatore può accelerare l'accesso al risultato aggiungendo un indice alla tabella materializzata. ... Dopo aver aggiunto l'indice, l'ottimizzatore può trattare la tabella derivata materializzata come una normale tabella con un indice e beneficia in modo simile dell'indice generato. Il sovraccarico della creazione dell'indice è trascurabile rispetto al costo dell'esecuzione della query senza l'indice.

Come sottolinea @ypercube, MariaDB 5.3 ha aggiunto la stessa ottimizzazione. Questo articolo presenta un'interessante panoramica del processo:

L'ottimizzazione viene applicata, quindi la tabella derivata non può essere unita al suo SELECT SELEZIONANTE, cosa che accade quando la tabella derivata non soddisfa i criteri per VISUALIZZARE unificabile


Non ho fatto test su queste affermazioni, ma MariaDB 5.3 (recentemente rilasciato come stabile) ha alcuni importanti miglioramentiFields of merge-able views and derived tables are involved now in all optimizations employing equalities
sull'ottimizzatore

@ypercube grazie per quel link ... sembra che MySQL 5.6 abbia almeno l'ottimizzazione dell'aggiunta di un indice alle tabelle derivate.
Derek Downey,

14

Le viste sono strumenti di sicurezza. Non si desidera che un determinato utente o applicazione sappia dove si trova la tabella dei dati, si fornisce una vista con solo le colonne di cui ha bisogno.

Ricorda che le visualizzazioni peggiorano sempre le prestazioni, query simili dovrebbero essere stored procedure e funzioni, non visualizzazioni.

Per effettuare una regolazione delle query, seguire sempre le migliori pratiche, evitare di utilizzare le funzioni nelle clausole WHERE, creare indici per velocizzare le selezioni, ma non abusare degli indici che degradano inserimenti, aggiornamenti ed eliminazioni.

Esiste una buona documentazione che può aiutarti: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234


5
Non sono d'accordo sul fatto che le visualizzazioni siano (solo) strumenti di sicurezza. Possono essere usati in questo modo, ma li usiamo per rimuovere la complessità nelle query che i nostri sviluppatori di report usano regolarmente.
JHFB,

2
@JHFB: Sono d'accordo con te, ma forse è solo così che funziona in MySQL, dove sembra che la vista incorra in gravi penalità di prestazione?
FrustratedWithFormsDesigner,

@frustratedwithformsdesigner ottimo punto: è da un po 'che non uso MySQL.
JHFB,

1
Le visualizzazioni @JHFB su Mysql sono un grosso problema! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla l'

2
@RainierMorilla Views peggiora le prestazioni !! ??
Suhail Gupta,

-2

penso che le viste siano la struttura predefinita (nessun dato) per unire le tabelle in una da superare da una query a più tabelle, che può essere utilizzata da dati reali per una rapida query relazionale ...


2
Non è molto chiaro quale punto stai cercando di chiarire e come questo affronti i problemi indicati nel post originale. Potresti voler rileggere la domanda, ma in ogni caso prendi in considerazione l'idea di ampliare la tua risposta per rendere più chiaro come può essere applicato al problema del PO.
Andriy M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.