Procedimientos almacenados en MySQL

Los procedimientos almacenados son un conjunto de instrucciones SQL que se almacenan en el servidor permitiendo hacer referencia al procedimiento almacenado para ejecutar esas funciones en lugar de tener que llamarlas individualmente.

Para poder ejecutar procedimientos almacenados es necesario tener la tabla proc en la base de datos mysql y contar con los permisos necesarios para trabajar con ellos. Estos son los permisos relacionados con los procedimientos:

  • CREATE ROUTINE: Permite crear procedimientos almacenados
  • ALTER ROUTINE: Da acceso a la modificación y borrado, se aplica por defecto al creador de un procedimiento.
  • EXECUTE: Requerido para poder ejecutar procedimientos almacenados, se otorga automáticamente al creador del procedimiento. Por defecto, quien tiene acceso a la base de datos también lo tiene para ejecutar los prodecimientos almacenados para esa base de datos.

Vamos a ver un ejemplo de como trabajar con procedimientos almacenados con un sencillo ejemplo. Para crearlo usaremos:

CREATE PROCEDURE sumar (IN valor INTEGER, OUT resultado INTEGER)
SELECT valor+valor INTO resultado;

Lo que estamos indicando es que se cree el procedimiento «sumar» con dos parámetros «valor» y «resultado», ambos del tipo INTEGER. El primero es un parametro de entrada y el segundo la variable donde almacenaremos el valor de salida. Ahora vamos a llamarlo usando:

CALL sumar(4, @resultado);

El procedimiento se encargara de hacer la suma de 4+4 y almacenar la salida en la variable @resultado. Para visualizar lo que contiene la variable:

SELECT @resultado;

Los procedimientos son una buena forma de trabajar con los datos almacenados en una base de datos, dejando a MySQL el trabajo de formatear y filtrar el manejo de los datos, por lo que la cantidad de información que ha de viajar entre la base de datos y nuestro programa se reduce considerablemente. Por otra parte usando dos servidores, uno para el programa y otro para la base de datos, podríamos trasladar parte de la carga de procesamiento a la base de datos.

Utilidad y uso de EXPLAIN en MySQL

logo_mysql

A la hora de realizar una buena optimización de las consultas de MySQL habrá que prestar mucha atención a lo que dice la cláusula EXPLAIN. Su sintaxis es muy sencilla, basta anteponerlo a la consulta que queremos realizar para obtener toda la información.

EXPLAIN SELECT columna1, columna2 FROM tabla1 WHERE columna3 = ‘2’\G

El resultado que obtendremos será el plan de ejecución de la consulta a la base de datos. Una explicación de como accederá MySQL a las diferentes columnas involucradas en la consulta. EXPLAIN devolverá:

  • id: Es el identificador que EXPLAIN asignará a la consulta.
  • select_type: Tipo de consulta a analizar. Por ejemplo, si se trata de una consulta sencilla su valor será SIMPLE.
  • table: Nombre de la tabla a la que hacen referencia el resto de datos en la fila. Hay que tener en cuenta que el orden de las filas será el que utilizará MySQL para acceder a los datos.
  • type: Indica como MySQL combinará los datos de esa tabla.
  • possible_keys: Lista de los indices que se podrían utilizar, aunque podría no usarse ninguno.
  • key: Índice que finalmente se usará, si no se usa ninguno el valor del campo será NULL.
  • key_len: Tamaño del indice utilizado, si no se usó ninguno contendrá NULL.
  • ref: Muestra con que campo está relacionado el índice seleccionado.
  • rows: Número de registros que se tendrán que recuperar para ejecutar la consulta.
  • extra: Información adicional sobre la forma en que se obtendrán los datos.

Con esta información es posible encontrar donde se producen los cuellos de botella en las consultas que realizamos a la base de datos, y nos permitirá optimizarlas para evitar que una consulta lenta provoque un retraso injustificado en la devolución de resultados a los usuarios. En el manual de MySQL puedes encontrar más información.

Replicación en MySQL 5.0

La replicación en MySQL se realiza entre un servidor Maestro (el que contine los datos originales) y uno o varios servidores Esclavos (los que replican los datos). Se realiza utilizando el log binario de MySQL, cuando se realiza un cambio en la base de datos del servidor Maestro, esto cambios son enviados al Esclavo para que los actualice. Hay que tener en cuenta que la replicación sólo se puede realizar en una dirección, del Maestro hacia el Esclavo, y no bidireccinalmente.

El servidor Esclavo mantiene una conexión permanentemente abierta con el Maestro y se comprueba la ultima posición escrita en el log binario del Maestro, cuando se detectan cambios estos se replican el las tablas del servidor Esclavo.

Antes de ponerse a configurar MySQL con una replicación, hay que tener en cuenta la compatibilidad entre versiones. Como norma general debería de intentarse que la versión de MySQL del Maestro y del Esclavo fuesen la misma, y lo más actualizada posible. De todos modos, un Esclavo con una versión más actualizada que el Maestro suele funcionar, pero no al contrario.

Una vez que conocemos como funciona, y realizadas las comprobaciones de versiones podemos configurar Maestro y Esclavo para que ejecuten la replicación. Comenzaremos por la configuración del Maestro. Debemos editar el fichero my.cnf que encontraremos normalmente en /etc/my.cnf o en /etc/mysql/my.cnf dependiendo del sistema que usemos.

Sigue leyendo Replicación en MySQL 5.0

A2Billing: Programa de facturación para Asterisk

Asterisk es una centralita telefónica bajo software libre. Nos permite tener un sistema de telefonía IP bajo diferentes protocolos y con distintos proveedores. Todo esto nos da la posibilidad de ofrecer llamadas a otros usuarios, lo cual en algunos casos puede significar crear un negocio con esto.
Y como en cualquier negocio lo importante es poder facturar, en este caso en función del destino de la llamada, el horario o el tipo de servicio utilizado. Para lograrlo A2Billing provee un software a través de entorno web que nos permite definir precios, tramos horarios, etc. Esta herramienta está desarrollada bajo PHP y MySQL.

En Twitter el 15-05-2008

  • Buenos días. Son las 5 de la madrugada y estoy desvelado, voy a leer unos feeds a ver si me entra el sueño #
  • Que bien sienta una buena sesión de deporte por la mañana #
  • New blog post: MySQL: Acceso a un servidor remoto http://tinyurl.com/5rukmw #
  • Tengo hambre, voy a hacer una parada para comer algo #
  • Cada pequeña, casi infima, interrupción retrasa un gran proyecto lo suficiente como para no hacerles caso #
  • De vuelta en la oficina, a seguir programando que tengo que teminar esto hoy #
  • MySQL Administrator, una buena herramienta cuando se trabaja con muchos servidores de bases de datos MySQL #
  • Tengo que preparar un pequeño resumen del evento sobre factura electrónica de ayer para publicar en el blog, que luego me olvido #
  • Termimando el post sobre factura electronica antes de ir a clase de ingles #
  • New blog post: Obigaciones específicas de la factura electrónica http://tinyurl.com/6x2kcx #
  • Revisando estadístacas y ratios #

MySQL: Acceso a un servidor remoto

La instalación por defecto de MySQL no da acceso a servidores remotos. Para poder conectarse en remoto a la base de datos de MySQL son necesarias dos cosas:

  • La primera que el usuario de MySQL con el que se quiere acceder tenga permisos para acceder desde cualquier servidor. Para lograr esto es necesario indicar en el campo Host de la tabla user de la base de datos mysql el parametro que indica cualquier servidor que es el simbolo ‘%’.  En el manual de MySQL tienes más información sobre como administrar usuarios de base de datos.
  • Lo segundo es modificar en el fichero my.cnf (si mysql corre sobre una maquina linux) o my.ini (en el caso de un servidor Windows) el parámetro bind-address, que por defecto viene con 127.0.0.1, y cambiarlo a 0.0.0.0 para que sea accesible desde cualquier servidor.