Procedimientos y Funciones Almacenadas en MySQL: Optimización y Mejores Prácticas
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 7,78 KB
Rutinas: Procedimientos y Funciones
Las rutinas (procedimientos y funciones) almacenadas son un conjunto de comandos que pueden almacenarse en el servidor. Una función almacenada es un programa almacenado que devuelve un valor. Los procedimientos devuelven valores a través de parámetros OUT e INOUT. Las funciones devuelven a través de cero o un único valor de retorno.
- DELIMITER: Indica el carácter de comienzo y fin del programa. Se utiliza
$$
. - DROP PROCEDURE IF EXISTS hola_mundo$$: Elimina el procedimiento si existe.
- CREATE PROCEDURE test.hola_mundo(): Comienzo de la definición de un procedimiento, nombre seguido de paréntesis para poner parámetros.
- BEGIN: Indica el comienzo de una serie de bloques de sentencias SQL que componen el cuerpo del procedimiento.
- SELECT: Imprime la cadena por pantalla.
- END$$: Fin.
Parámetros y Variables
- DECLARE: Crea una nueva variable con su nombre y tipo (CHAR, VARCHAR...).
- SET: Permite asignar valores a las variables usando el operador de igualdad.
- Tipos de parámetros:
- IN: Es el valor por defecto y sirve para incluir parámetros de entrada que usará el procedimiento.
- OUT: Parámetro de salida. El procedimiento puede asignar valores a dichos parámetros que son devueltos en la llamada.
- INOUT: Permite pasar valores al programa que serán modificados y devueltos en la llamada.
Estructuras de Control
- CASE: Cuando hay muchas condiciones. Ejemplo:
CASE variable1 WHEN 0 THEN INSERT INTO t VALUES(17); END CASE;
- Bucles:
- LOOP: Ejemplo:
bucle: LOOP SELECT 'esto no se acaba'; END LOOP bucle;
- LOOP: Ejemplo:
- Cursor:
- DECLARE cursor_name CURSOR FOR select_statement: Declara un cursor.
- OPEN: Inicializa el conjunto de resultados asociados con el cursor.
- FETCH: Extrae la siguiente fila de valores del conjunto de resultados del cursor, moviendo el puntero una posición.
- CLOSE: Cierra el cursor, liberando la memoria que ocupa.
Triggers (Disparadores)
Un trigger es un disparador que se activa cuando hay un INSERT
, DELETE
o UPDATE
.
Sintaxis: CREATE TRIGGER nombre_disparador momento_disparador evento_disparador ON nombre_tabla FOR EACH ROW sentencia_disparador
- Momento: Puede ser
BEFORE
oAFTER
. - Evento: Puede ser
INSERT
,UPDATE
oDELETE
. - No puede haber dos disparadores en una misma tabla que correspondan al mismo momento y evento. No se puede tener dos disparadores
BEFORE UPDATE
. - Se puede tener
BEFORE UPDATE
yBEFORE INSERT
oBEFORE UPDATE
yAFTER UPDATE
. - OLD y NEW permiten acceder a columnas en los registros afectados por un disparador.
- Eliminación de triggers:
DROP TRIGGER IF EXISTS schema_name.trigger_name;
- Consulta de triggers:
SHOW TRIGGERS
Vistas
Las vistas son objetos de la base de datos que, mediante una consulta, incluyen un subconjunto de datos de la base. Es como una consulta guardada. Podemos borrar y actualizar los datos de una vista de forma que queden reflejados en los correspondientes campos de las tablas subyacentes.
Existen restricciones:
- No se pueden usar tablas temporales.
- No usar cláusulas
GROUP BY
niHAVING
. - No usar uniones ni reuniones externas.
- No usar consultas correlacionadas.
- Para el caso de
INNER JOIN
, podemos actualizar o insertar siempre y cuando los campos afectados sean únicamente los de las tablas implicadas en elJOIN
.
Las vistas pueden crearse a partir de varios tipos de sentencias SELECT
. Algunas vistas son actualizables.
- CREATE VIEW: Para creación.
- ALTER VIEW: Para modificación.
- DROP VIEW: Eliminación.
- Consulta:
SHOW CREATE VIEW
.
Índices en MySQL: Tipos y Optimización para Mejorar el Rendimiento
Un índice es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla. Se suelen crear sobre campos con frecuentes búsquedas.
Ejemplo: ALTER TABLE movimientos ADD INDEX (codigo_cuenta)
Tipos de Índices
- Parciales: Ahorran espacio a costa de disminuir el rendimiento. Ejemplo:
ALTER TABLE posts ADD INDEX(pcontenido(120))
- Multicolumna: Es la posibilidad de crear índices sobre más de una columna. Ejemplo:
ALTER TABLE post ADD INDEX (pcontenido(120)), pfecha)
- Secundarios y Clúster: InnoDB utiliza índices clúster. En ellos se guardan las claves primarias junto con los registros ordenados respecto a la clave primaria, así las búsquedas por clave primaria son muy rápidas.
- Estructura de un índice:
- B-Tree: Está formado por un conjunto de nodos, cada uno de los cuales contiene valores de índice ordenados que apuntan a registros de disco. Son recomendables en consultas basadas en rangos de datos con cláusulas
BETWEEN
y operadores de comparación. - Hash: Son más rápidos que B-Tree, pero menos predecibles y flexibles, ya que tienen colisiones y lentitud en consultas basadas en rangos de valores.
- R-Tree: Son usados para datos de tipo espacial, como coordenadas de un objeto.
- B-Tree: Está formado por un conjunto de nodos, cada uno de los cuales contiene valores de índice ordenados que apuntan a registros de disco. Son recomendables en consultas basadas en rangos de datos con cláusulas
Índices en MySQL
- UNIQUE: Para campos que no se repiten en la tabla.
- PRIMARY: Son índices sobre los campos que forman parte de la clave primaria de una tabla.
- FULLTEXT: Uno o varios campos de texto y utilizados para la búsqueda de palabras dentro de un campo en funciones de búsqueda de cadenas.
- SPATIAL: Índices usados para los datos de tipos espaciales, como
LINE
oCURVE
.
Índices en MyISAM, BEAP y BDB
- MyISAM: Usan índices tipo B-Tree.
- BEAP: Para trabajos masivos y se almacenan completamente en memoria. Pueden usar también B-Tree y Hash.
- BDB: Los índices se guardan junto a los datos de las tablas y estos solo pueden ser de tipo B-Tree.
Optimización en MySQL
- Usar los tipos de datos menores posible siempre que se ajusten a nuestros requisitos.
- Siempre que sea posible, utilizaremos
NOT NULL
en la definición de nuestros campos. - Usar
COMPACT
oCOMPRESSED
para la opciónROW_FORMAT
cuando creamos tablas InnoDB. - Para MyISAM, indicar
ROW_FORMAT FIXED
. - El índice de la clave primaria debe ser lo más pequeño posible para acelerar la búsqueda de datos en consultas.
- Debemos crear solo los índices adecuados según nuestras necesidades.
- Crear índices conjuntos en lugar de uno por cada campo.