2010-05-03 17 views
18

Tengo una tabla para aproximadamente 100,000 usuarios en ella.MySQL view performance

Primer caso:

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

Cuando hago un plan de explicación de la consulta anterior consigo el costo como 5200

Segundo caso:

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

Explain select cnt from vw_users where state = 'ca' 

cuando hago un explicar el plan en la segunda consulta, recibo el costo de 100.000.

¿Cómo funciona la cláusula where en la vista? ¿La cláusula where se aplica después de que la vista recupera todas las filas? ¿Cómo soluciono este problema?

+2

Su definición de la vista no se encuentra la cláusula group by –

+0

Si no puede usar el algoritmo de fusión, aquí hay un trabajo que encontré útil: [Solución alternativa para los problemas de rendimiento de las vistas temporales] (http://www.mysqlperformanceblog.com/2010/05/19/a-workaround- para-el-rendimiento-problemas-de-temptables-vistas /) – landoncz

Respuesta

28

Se trata del view algorithm que se ha utilizado.

El fusión algoritmo funciona bien la mayoría de los índices de las tablas y otras cosas - el algoritmo TempTable no - en muchos casos los índices será sólo de plano no se utiliza en absoluto.

Y hay un montón de basura que se fusionan no soporta

de mezcla no puede ser utilizado si la vista contiene cualquiera de los siguientes construcciones:

* 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, gracias por la entrada. Tengo un conteo (*) en mi opinión. Entonces no puedo usar fusionar En este momento no especifiqué ningún tipo de algoritmo. Entonces, ¿cuál es la mejor manera de usar un procedimiento almacenado en lugar de una vista? – vamsivanka

+0

Sí, tendrá que buscar aquí un procedimiento almacenado, o simplemente una subconsulta completa. –

+0

Peter, muchas gracias. – vamsivanka