2012-04-24 18 views
51

Si va por el camino del uso de vistas, ¿cómo puede garantizar un buen rendimiento?MySql views performance

¿O es mejor no usar las vistas en primer lugar e incorporar el equivalente en las declaraciones seleccionadas?

+5

He encontrado [este artículo del blog] (http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/) por Peter Zaitsev bastante informativo en el pasado. – eggyal

+0

@eggyal - Gracias, tendrá una lectura y un pensar –

+0

Comprobar también la reciente ** [MariaDB 5.3] (http://kb.askmonty.org/en/what-is-mariadb-53) ** (y 5.5) lanzamientos que tienen varias mejoras en el optimizador, incluidas las Vistas. –

Respuesta

79

Depende.

Totalmente depende de lo que está viendo a través de la vista. Pero lo más probable es que reduzcas tu esfuerzo y obtengas un mayor rendimiento. Cuando la declaración de SQL hace referencia a una vista no indexada, el analizador y el optimizador de consultas analizan el origen de la declaración de SQL y de la vista y luego los resuelven en un solo plan de ejecución. No hay un plan para la declaración SQL y un plan separado para la vista.

Una vista no compilada. Es una tabla virtual compuesta de otras tablas. Cuando lo creas, no reside en algún lugar de tu servidor. Las consultas subyacentes que componen la vista están sujetas a las mismas mejoras de rendimiento o dings del optimizador de consultas. Nunca he probado el rendimiento en una vista VS su consulta subyacente, pero me imagino que el rendimiento puede variar ligeramente. Puede obtener un mejor rendimiento en una vista indizada si los datos son relativamente estáticos. Esto puede ser lo que estás pensando, tal vez en términos de "compilado".

Ventajas de vistas:

  1. Ver los datos sin almacenar los datos en el objeto.
  2. Restituye la vista de una tabla, es decir, puede ocultar algunas de las columnas en las tablas.
  3. Unir dos o más tablas y mostrarlo como un objeto para el usuario.
  4. Restituye el acceso de una tabla para que nadie pueda insertar las filas en la tabla.

Ver estos enlaces útiles:

  1. Performance of VIEW vs. SQL statement
  2. Is a view faster than a simple query?
  3. Mysql VIEWS vs. PHP query
  4. Are MySql Views Dynamic and Efficient?
  5. Materialized View vs. Tables: What are the advantages?
  6. Is querying over a view slower than executing SQL directly?
  7. A workaround for the performance problems of TEMPTABLE views
  8. See performance gains by using indexed views in SQL Server
+1

que mencionas vistas indizadas y tiene varios enlaces para indexados y vistas materializadas artículos. Esto está bien y bien. Pero, ¿tiene MySQL vistas indexadas? –

+4

Actualmente, MySQL no admite vistas indizadas. –

+2

Buena respuesta. Simplemente agregaré que una vista es básicamente una consulta con nombre en MySQL. Si se asegura de que la consulta que genera la vista tiene un buen rendimiento cuando se ejecuta por sí mismo, la vista debería funcionar de manera similar. –

6

Creo que el blog de Peter Zaitsev tiene la mayoría de los detalles. Hablando desde la experiencia personal, las vistas pueden funcionar bien si generalmente las mantienes simples. En uno de mis clientes, mantuvieron capas de una vista encima de otra y terminaron en una pesadilla de rendimiento.

Generalmente uso vistas para mostrar un aspecto diferente de una tabla. Por ejemplo, en la tabla de mis empleados, muéstreme a los gerentes u oculte el campo de salario de los empleados que no son de recursos humanos. Además, siempre asegúrese de ejecutar EXPLAIN en la consulta y ver para comprender exactamente qué está sucediendo dentro de MySQL.

Si desea una prueba sólida en su escenario, le sugiero que la pruebe. Es realmente difícil decir que el uso de vistas siempre es un factor determinante del rendimiento, y una vez más, una visión mal escrita probablemente va a matar tu rendimiento.

3

Si estamos discutiendo "si usa vistas, cómo garantizar el rendimiento", y no el efecto de rendimiento de las vistas en general, creo que se reduce a la contención (como en usted).

Puede obtener un gran problema si solo escribe las vistas para hacer que su consulta sea simple en todos los casos, pero no se preocupe de que sus vistas sean realmente útiles para el rendimiento. Cualquier consulta que hagas al final debería funcionar de manera sensata (mira el ejemplo de comentario de ese enlace por @eggyal). Por supuesto que es una tautología, pero por lo tanto no es menos valiosa

Especialmente debe tener cuidado de no hacer vistas desde las vistas, simplemente porque eso podría hacer que sea más fácil hacer esa vista.

Al final, debe ver el motivo por el que utiliza las vistas. Cada vez que hagas esto para hacer la vida más fácil al final de la programación, será mejor que tengas un procedimiento almacenado en mi humilde opinión.

Para mantener las cosas bajo control es posible que desee escribir por qué tiene una determinada vista y decidir por qué la está utilizando. Por cada 'nuevo' uso dentro de su programación, vuelva a verificar si realmente necesita la vista, por qué la necesita y si esto aún le daría una ruta de ejecución sensata. Sigue comprobando tus usos para mantenerlo rápido, y sigue comprobando si realmente necesitas esa vista.

4

Aquí hay un resumen de tl; dr, puede encontrar evaluaciones detalladas de Peter Zaitsev y de otros lugares.

Las vistas en MySQL generalmente son una mala idea. En Grooveshark los consideramos dañinos y siempre los evitamos. Si tiene cuidado, puede hacer que funcionen pero, en el mejor de los casos, son una forma de recordar cómo seleccionar datos o evitar que tenga que volver a escribir uniones complicadas. En el peor de los casos, pueden causar ineficiencias masivas, ocultar la complejidad, provocar subsecciones anidadas accidentales (que requieren tablas temporales y provocar agolpamiento del disco), etc.

Lo mejor es evitarlas y mantener sus consultas en el código.

+1

Me gustaría que se han visto este comentario antes de que mi equipo y yo poner todos esos puntos de vista con una gran cantidad de combinaciones en nuestra base de datos de producción:/ – Ralph

6

Sirven para su propósito, pero las complejidades e ineficiencias ocultas generalmente superan un enfoque más directo. Una vez encontré una declaración de SQL que se unía en dos vistas y las ordenaba los resultados. Las vistas también se clasificaban, por lo que el tiempo de ejecución se podía medir en lo que parecían horas.

3

Una cosa no ha mencionado hasta ahora, pero haciendo una gran diferencia es la indexación adecuada de los puntos de vista de fuente tablas.

Como se mencionó anteriormente, puntos de vista no residen en su base de datos, pero sereconstruir cada vez que. Por lo tanto, todo lo que facilita la reconstrucción del DB aumenta el rendimiento de la vista.

A menudo, las vistas unen los datos de una manera muy mala para el almacenamiento (sin forma normal) pero muy buenos para su uso posterior (análisis, presentación de datos al usuario, ...) y unir y agregar datos de diferentes mesas.

Independientemente de si las columnas en las que se realizan las operaciones están indizadas o no, la diferencia en el rendimiento de una vista es enorme. Si las tablas y sus columnas relevantes están indexadas, el acceso a la vista no termina al volver a calcular los índices una y otra vez primero.(En el lado negativo, esto se hace cuando los datos se manipula en las tablas de origen)

! ¡Indexe todas las columnas utilizadas en las cláusulas JOINS y GROUP BY en su declaración CREATE VIEW!