it-swarm.it

MySql visualizza le prestazioni

Se stai seguendo la strada dell'utilizzo delle viste, come puoi garantire buone prestazioni?

O è meglio non utilizzare le viste in primo luogo e semplicemente incorporare l'equivalente nelle dichiarazioni selezionate?

64
Ed Heal

Dipende.

Dipende totalmente da ciò che stai visualizzando attraverso la vista. Ma molto probabilmente riducendo i tuoi sforzi e dando prestazioni più elevate. Quando l'istruzione SQL fa riferimento a una vista non indicizzata, il parser e Query Optimizer analizzano l'origine dell'istruzione SQL e della vista e quindi le risolvono in un unico piano di esecuzione. Non esiste un piano per l'istruzione SQL e un piano separato per la vista.

Una vista non viene compilata . È una tabella virtuale composta da altre tabelle. Quando lo crei, non risiede da qualche parte sul tuo server. Le query sottostanti che compongono la vista sono soggette agli stessi guadagni in termini di prestazioni o dings di Query Optimizer. Non ho mai testato le prestazioni in una vista VS la query sottostante, ma immagino che le prestazioni possano variare leggermente. È possibile ottenere prestazioni migliori in una vista indicizzata se i dati sono relativamente statici. Questo potrebbe essere quello che stai pensando forse in termini di "compilato".

Vantaggi delle viste:

  1. Visualizza i dati senza archiviarli nell'oggetto.
  2. Limitare la visualizzazione di una tabella, ad esempio è possibile nascondere alcune delle colonne nelle tabelle.
  3. Unire due o più tabelle e mostrarlo come un oggetto all'utente.
  4. Limitare l'accesso a una tabella in modo che nessuno possa inserire le righe nella tabella.

Vedi questi link utili:

  1. Performance of VIEW vs. istruzione SQL
  2. na vista è più veloce di una semplice query?
  3. Mysql VIEWS vs. PHP query
  4. Le visualizzazioni MySql sono dinamiche ed efficienti?
  5. Vista materializzata vs. tabelle: quali sono i vantaggi?
  6. L'interrogazione su una vista è più lenta dell'esecuzione diretta di SQL?
  7. na soluzione alternativa per i problemi di prestazioni delle viste TEMPTABLE
  8. Vedi i miglioramenti delle prestazioni usando le viste indicizzate in SQL Server
92
Somnath Muluk

Penso che il blog di Peter Zaitsev abbia la maggior parte dei dettagli. Parlare da visualizzazioni di esperienze personali può funzionare bene se in genere le rendi semplici. A uno dei miei clienti hanno continuato a sovrapporre una vista sopra l'altra e si è conclusa in un incubo di perfomance.

In genere utilizzo le viste per mostrare un aspetto diverso di una tabella. Ad esempio, nella tabella dei miei dipendenti, mostrami i gestori o nascondi il campo retributivo ai dipendenti non HR. Inoltre, assicurati sempre di eseguire un EXPLAIN sulla query e di visualizzare per capire esattamente cosa sta accadendo all'interno di MySQL.

Se vuoi una prova solida nel tuo scenario, ti suggerirei di testare. È davvero difficile dire che l'uso delle viste è sempre un killer delle prestazioni, quindi una visione mal scritta probabilmente ucciderà le tue prestazioni.

8
Namphibian

Servono al loro scopo, ma le complessità e le inefficienze nascoste di solito superano un approccio più diretto. Una volta ho incontrato un'istruzione SQL che si univa in due viste e le ordinava i risultati. Anche le viste erano ordinate, quindi il tempo di esecuzione poteva essere misurato in quelle che sembravano ore.

7
GDP

Ecco un riassunto di tl; dr, puoi trovare valutazioni dettagliate da Peter Zaitsev e altrove.

Le viste in MySQL sono generalmente una cattiva idea. A Grooveshark li consideriamo dannosi e li evitiamo sempre. Se stai attento puoi farli funzionare, ma nella migliore delle ipotesi sono un modo per ricordare come selezionare i dati o impedirti di dover riscrivere i join complicati. Nel peggiore dei casi, possono causare enormi inefficienze, nascondere complessità, causare sottoselezioni annidate accidentali (che richiedono tabelle temporanee e che portano al blocco del disco), ecc.

È meglio evitarli e mantenere le tue domande nel codice.

7
Jay Paroline

Una cosa non menzionata finora, ma che fa una grande differenza è adeguata indicizzazione delle tabelle delle viste sorgente .

Come accennato in precedenza, le viste non risiedono nel tuo DB ma sono ricostruisci ogni volta. Pertanto, tutto ciò che semplifica la ricostruzione del DB aumenta le prestazioni della vista.

Spesso, le viste uniscono i dati in un modo molto negativo per l'archiviazione (nessun modulo normale) ma molto buono per un ulteriore utilizzo (analisi, presentazione dei dati all'utente, ...) e quindi l'unione e l'aggregazione di dati da diverse tabelle.

Indipendentemente dal fatto che le colonne su cui vengono eseguite le operazioni siano indicizzate o meno, fa una differenza enorme sulle prestazioni di una vista. Se le tabelle e le rispettive colonne sono indicizzate già accedendo alla vista non termina nel rielaborare ripetutamente gli indici prima. (sul lato negativo, questo viene fatto quando i dati vengono manipolati nelle tabelle di origine)

! Indicizza tutte le colonne utilizzate nelle clausole JOINS e GROUP BY nell'istruzione CREATE VIEW!

3
petermeissner

Se stiamo discutendo "se usi le viste, come garantire le prestazioni", e non l'effetto delle prestazioni delle viste in generale, penso che si riduca a moderazione (come in te stesso).

Puoi creare grossi problemi se scrivi semplicemente visualizzazioni per rendere la tua query semplice in tutti i casi, ma non preoccuparti che le tue visualizzazioni siano effettivamente utili dal punto di vista delle prestazioni. Qualsiasi query che stai facendo alla fine dovrebbe essere sana (vedi l'esempio di commento da quel link di @eggyal). Naturalmente questa è una tautologia, ma quindi non meno preziosa

In particolare, devi fare attenzione a non creare viste dalle viste, solo perché ciò potrebbe rendere più semplice la visualizzazione.

Alla fine è necessario esaminare il motivo per cui si stanno utilizzando le visualizzazioni. Ogni volta che lo fai per rendere la vita più facile dal punto di vista della programmazione potresti essere meglio con una procedura memorizzata IMHO.

Per tenere sotto controllo le cose, potresti voler scrivere perché hai una certa vista e decidere perché la stai usando. Per ogni "nuovo" utilizzo all'interno della tua programmazione, ricontrolla se effettivamente hai bisogno della vista, perché ne hai bisogno e se questo ti darebbe comunque un percorso di esecuzione sensato. Continua a controllare i tuoi usi per mantenerlo veloce e continua a controllare se hai davvero bisogno di quella vista.

3
Nanne