2011-01-25 14 views
23

Ho una query complessa che utilizza molti join (8 in effetti). Stavo pensando di semplificarlo in una vista. Dopo una piccola ricerca, posso vedere i vantaggi in semplicità e sicurezza. Ma non ho visto alcuna menzione di velocità.Una vista MySQL è più veloce di una normale query?

Le viste funzionano come istruzioni preparate, in cui la query è precompilata? C'è un notevole aumento delle prestazioni dall'uso delle viste?

+2

Alcuni database pre-compilano la vista, ma non credo che lo farà MySQL. Potresti voler dare un'occhiata a questa domanda: http://stackoverflow.com/questions/1021319/how-to-optimize-mysql-views –

+0

Contrariamente alle risposte - Nella mia esperienza, per le viste con molti join, fare un direct la query viene eseguita più velocemente. –

risposta

13

No, una vista è semplicemente una query di testo memorizzata. È possibile applicare WHERE e ORDER contro di esso, il piano di esecuzione verrà calcolato con quelle clausole prese in considerazione.

+4

Questo non è assolutamente vero. È fondamentalmente corretto se si sceglie l'unione per l'algoritmo di visualizzazione, ma se si sceglie temptable si materializzerà. Non definito (il valore predefinito, se non specificato) consente a MySQL di scegliere, cosa che può fare qualcosa che non ti aspetti. – Ray

+0

Non sono uno specialista di MySQL, ma sono abbastanza sicuro che l'algoritmo TempTable controlla come MySQL elabora la vista quando vengono richiesti i risultati e non ha alcun effetto sul modo in cui la vista viene archiviata. –

+0

Sì, il che è molto diverso dall'avere semplicemente una parte di testo che viene eseguita come se fosse una query ad hoc. – Ray

0

Può a volte aiutare, ma non è un proiettile d'argento. Ho visto una vista come aiuto per le prestazioni, ma ho anche visto che mi ha fatto male. Una vista può forzare la materializzazione, che a volte può darti un percorso di accesso migliore se MySQL non sta scegliendo una buona soluzione per te.

+0

MySQL non supporta visualizzazioni materializzate. Quindi non riesco a vedere come potrebbe aiutare le prestazioni rispetto alla query equivalente ... – ircmaxell

+0

Non chiamano le viste materializzate, ma "temptable" è uno degli algoritmi di visualizzazione, che fa all'incirca quanto suggerisce il nome – Ray

+1

Ho cercato questo su e l'algoritmo temptable è _definitamente non_ una versione di viste materializzate. Ad oggi, non esiste alcun supporto per le viste materializzate o qualsiasi forma di viste pre-risolte, in MySQL (a meno che non si proietta manualmente una vista su una tabella su base periodica). –

0

Una vista è fondamentalmente una sottoquery memorizzata. Non c'è nessuna differenza sostanziale tra:

SELECT * 
FROM someview 

e

SELECT * 
FROM (
    SELECT somestuff 
    FROM underlying table 
); 

tranne la vista è un po 'più portatile, come non c'è bisogno di scrivere la query sottostante ogni volta che si desidera lavorare con qualsiasi dato ritorna.

+1

E se MySql sceglie un algoritmo di visualizzazione temporaneo? – Ray

+2

Sono completamente in disaccordo. un MySQL VIEW non è solo un alias per una stringa memorizzata di una query.Puoi avere enormi guadagni o perdite di prestazioni se lo usi correttamente o no. Vedi la mia risposta per maggiori dettagli. – Juan

Problemi correlati