systemadmin.es > DBA > Vistas (views) en MySQL

Vistas (views) en MySQL

Una vista es un objecto de la base de datos que se define mediante una SELECT que agrupa o selecciona un conjunto de datos. Vamos a ver como usarlas.

Vamos a suponer la tabla valias:

mysql> desc valias;
+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| alias       | char(32) | NO   | MUL | NULL    |       |
| domain      | char(64) | NO   |     | NULL    |       |
| valias_line | text     | NO   |     | NULL    |       |
+-------------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)

En esta tabla podemos consultar los alias de correo para todos los dominios del servidor. Para poder dar acceso a un usuario que solo tenga acceso a sus dominios lo podemos hacer mediante vistas. Por ejemplo, podemos crear una vista para un determinado dominio mediante la siguiente vista:

mysql> create view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es";
Query OK, 0 rows affected (0.04 sec)

A continuación mediante la vista podremos acceder solo a los datos que la vista selecciona:

mysql> select * from valias_systemadmin_es;
+---------------+-----------------------------+
| alias         | valias_line                 |
+---------------+-----------------------------+
| helpdesk      | &diwit@systemadmin.es       |
(...)

Una de las confusiones más comunes entre los programadores es suponer un aumento del rendimiento por usar vistas. Vamos a ver como funcionan realmente.

Mediante la palabra clave “ALGORITHM” podemos indicar como deseamos que funcione:

  • UNDEFINED: Dejamos que sea MySQL quien decida el algoritmo por si mismo, es el caso por defecto.
  • MERGE: Se refiere a que junte la query que se hace sobre la vista con la query de la vista y se ejecute la query resultante. De esta manera vemos como la query que se ejecuta sobre una vista es tan complicada como la suma de las dos queries. Esto lo tenemos que tener muy en cuenta, ya que estamos ocultando la query que realmente ejecuta MySQL. Un ejemplo sería:
    mysql> create ALGORITHM=MERGE view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es";
    Query OK, 0 rows affected (0.00 sec)
    

    El EXPLAIN resultante sería:

    mysql> explain select * from valias_systemadmin_es;
    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+
    | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+
    |  1 | SIMPLE      | valias | ALL  | NULL          | NULL | NULL    | NULL |   27 | Using where |
    +----+-------------+--------+------+---------------+------+---------+------+------+-------------+
    1 row in set (0.03 sec)
    
  • TEMPTABLE: En el momento de hacer una consulta sobre la vista se crea una tabla temporal. Un ejemplo sería:
    mysql> create ALGORITHM=TEMPTABLE view valias_systemadmin_es as select alias, valias_line from valias where domain="systemadmin.es";
    Query OK, 0 rows affected (0.00 sec)
    

    Con su correspondiente EXPLAIN:

    mysql> explain select * from valias_systemadmin_es;
    +----+-------------+------------+------+---------------+------+---------+------+------+-------------+
    | id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra       |
    +----+-------------+------------+------+---------------+------+---------+------+------+-------------+
    |  1 | PRIMARY     | <derived2> | ALL  | NULL          | NULL | NULL    | NULL |   15 |             |
    |  2 | DERIVED     | valias     | ALL  | NULL          | NULL | NULL    | NULL |   27 | Using where |
    +----+-------------+------------+------+---------------+------+---------+------+------+-------------+
    2 rows in set (0.00 sec)
    

    El caso de TEMPTABLE tiene una gran ventaja y una gran desventaja:

    • Desventaja: La vista no es actualizable, por lo que cualquier cambio se deberá hacer en la tabla original.
    • Ventaja: Los bloqueos se liberan antes, ya que la consulta de la vista se hace a partir de la tabla temporal. Esto permite que otros threads accedan antes a la tabla que ejecutando una consulta mucho mas pesada usando el algoritmo MERGE.

El concepto de vistas materializadas no existe en MySQL, a diferencia de Oracle. Al usar vistas materializadas si que podríamos obtener un mayor rendimiento, pero en ningún de los dos algoritmos de MySQL obtenemos tal beneficio al tener que recurrir a crear el subconjunto de datos de la vista por cada petición.

7 comments to “Vistas (views) en MySQL”

  1. Podrias crear una vista-tabla (si los datos no caducan) y asi tendrias el augmento de rendimiento

  2. El tema esta en que las vistas materializadas no existen en la versión actual de MySQL, por lo que en realidad tienes un empeoramiento del rendimiento.

  3. Las vistas en mysql las dejé de usar porque siempre me dieron más problemas que soluciones. Lo peor de todo es que no se permiten sentencias update sobre las vistas por lo tanto no sirven para bases de datos bien escalables, en rendimiento no te ofrecen nada (en mi caso empeoró el rendimiento con el uso de vistas)… Por lo tanto el único uso que le veo es sacar un poco de código SQL de tu programa para pasarlo al motor que también tiene sus desventajas. Realmente no se para que están.

  4. Yo las veo útiles para dar una visión parcial de algunas tablas a ciertos usuarios de la base de datos, pero se debe ser cuidadoso dónde implementarlas para que no sean un problema

  5. Cual es la ventaja en utilizar una vista a una query normal?

  6. En realidad viene a ser lo mismo, sólo presenta ventajas para reducir la visibilidad de una cierta tabla

  7. Si yo tengo una tabla digamos “Productos” que contiene 20mil registros, tonces yo hago una vista “view_productos” ya arregladita con presentaciones y otras cosillas.. en fin la vista al ejecutarla salen los 20k productos arregladitos…
    ahora yo ejecuto un SP donde hago un select de 4 productos haciendo uso de esa vista.
    Select vista_producto.Nombre,
    vista_producto.Presentacion,
    vista_producto.Precio,
    vista_producto.etc
    WHERE vista_producto.xxx = ParametroYYY.

    entonces.. mi pregunta es….

    el ejecutar yo mi SP… este llama a la vista.. la vista se arma con los 20mil registros y de ahi me da los que yo quiero. y dije con el ParametroYYY?

    o
    el ejecutar yo mi SP… este llama a la vista.. la vista se arma unicamente con los registros que yo quiero.en el ParametroYYY?

    agradesco la aclaracion..

    Jairo Hernandez

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>