2011-10-27 13 views
29

Stavo pensando di iniziare a utilizzare le visualizzazioni per ridurre la complessità del codice e delle query nel nostro progetto - alcune di esse hanno alcuni join, e da quello che ho capito, le viste di MySQL ci consentirebbero di fare riferimento che i dati un po 'più facili in più posti.MySQL Views and index use

C'è un sacco di roba in giro, dove "MySQL non usa indici per le viste", "Non puoi avere una vista indicizzata", "Solo se usi MERGE" ... Non è chiaro risposta di taglio.

Quindi, per tagliare all'inseguimento: Le viste MySQL utilizzano gli indici sulle tabelle che sono state create da? È una cattiva idea utilizzare le visualizzazioni perché le prestazioni saranno pessime o utilizzeranno gli indici nelle tabelle sottostanti quando eseguono i suoi join? Se ordino una vista per una colonna che è indicizzata nella tabella, continua a essere ordinata così velocemente come normalmente?

Fare la mia ricerca sembra indicare che le viste non usano gli indici, ma se questo fosse il caso nessuno li userebbe mai; ovviamente le persone lo fanno, quindi ...?

Scusa se questo sembra un po 'assurdo.

+0

Vedere http://stackoverflow.com/q/244226/632951 – Pacerier

risposta

29

Se si interroga una visualizzazione, MySQL prevede prendere in considerazione l'utilizzo di indici nelle tabelle sottostanti.

Tuttavia è non possibile aggiungere un nuovo indice a una colonna calcolata nella vista. Penso che questo sia ciò che le persone intendevano per MySQL non avere viste indicizzate, al contrario di (ad esempio) SQL Server's indexed views.

+0

Stavo iniziando a credere che fosse il caso, ma volevo essere assolutamente sicuro prima di impegnarmi in qualcosa. Grazie mille. – Xkeeper

15

Le viste MySQL utilizzano indici sulle tabelle da cui sono stati creati?

Sì.

Ciò a cui le persone si riferiscono quando dicono MySQL doesn't use indexes for views è qualcosa chiamato materialized views o indexed views su cui la vista effettiva viene fisicamente archiviata nel file system come sarebbe la tabella normale. Gli indici possono essere creati per queste viste su alcuni DBMS come Oracle o SQL Server. Essenzialmente, indexed views diventa una copia delle tabelle originali che lo compongono ed è kept in sync automatically, una sorta di parlare.

Leggi questo articolo relativo a Indexed Views su SQL Server, ad esempio.

+0

Capisco ... Vorrei poter accettare entrambe le tue risposte perché sono entrambe molto, molto buone. In quella nota, sembra che si possa psuedo-gimp una soluzione avendo un trigger INSERT/UPDATE-based che crea una tabella basata fuori dalla vista (possibilmente?), Ma che sarebbe un colpo di prestazioni tale da essere inutile al di fuori di un database archiviato. – Xkeeper