2010-05-03 14 views
18

Ho una tabella per circa 100.000 utenti al suo interno.Performance vista MySQL

primo caso:

explain select state, count(*) as cnt from users where state = 'ca' 

Quando faccio un spiego piano per la query di cui sopra ottengo il costo come 5200

Secondo caso:

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

quando faccio un spiegano piano sulla seconda query ottengo il costo di 100.000.

Come funziona la clausola where nella vista? La clausola where viene applicata dopo che la vista recupera tutte le righe? Come posso risolvere questo problema?

+2

tua definizione di vista manca il gruppo per clausola. –

+0

Se non è possibile utilizzare l'algoritmo di fusione, ecco un lavoro che ho trovato utile: [Soluzione temporanea per i problemi di prestazioni delle viste temporanee] (http://www.mysqlperformanceblog.com/2010/05/19/a-workaround- for the performance-problems-of-temptable-views /) – landoncz

risposta

28

Si tratta dello view algorithm che è stato utilizzato.

La fusione algoritmo funziona bene la maggior parte degli indici delle tabelle e quant'altro - l'algoritmo TempTable non - in molti casi gli indici sarà solo flat-out non utilizzati affatto.

E c'è un sacco di merda che si fondono non supporta

fusione non può essere utilizzato se la vista contiene uno dei seguenti costrutti:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

Peter, Grazie per l'input. Ho un conteggio (*) a mio avviso. Quindi non posso usare l'unione. In questo momento non ho specificato alcun tipo di algoritmo. Quindi il modo migliore può essere utilizzare una procedura memorizzata invece di una vista? – vamsivanka

+0

Sì, dovrete andare qui per una stored procedure - o solo per una subquery diretta. –

+0

Peter, molte grazie. – vamsivanka