Entradas etiquetadas ‘SQL’

Mejorando el COUNT(*) de MySQL para las paginaciones

25 de Septiembre de 2009

Generalmente cuando paginamos resultados bajo PHP / MySQL, primero generamos la consulta a la BBDD con el Where y unos “LIMIT” para mostrar solo el “rango” de registros que nos interesa para la página solicitada.

Justo después de esta tipica consulta viene el COUNT (*) pero sin apliar LIMITS ni nada  para saber cuantos registros tenemos en total en la BBDD y “pintar” el sistema de paginación, es decir, la navegación de las páginas.

Pues bien, MySQL tiene un par de funciones que básicamente hacen una especie de COUNT(*) pero mucho más veloz y que vale la pena aplicar en esta situación:

  • SQL_CALC_FOUND_ROWS: calcula el número de resultados de una consulta sin LIMIT.
  • FOUND_ROWS: obtiene el resultado del último SQL_CALC_FOUND_ROWS ejecutados.

Por ejemplo, vamos a obtener de la tabla noticias,  los 5 registros de la página 2 con el sistema sin count (*):

$sql = "select SQL_CALC_FOUND_ROW id, titulo, contenido from noticias where publicado = 1 LIMIT 5,5";
 
$sqlCount = "select FOUND_ROWS() as total ";

El sistema no te libra de ejecutar 2 consultas SQL contra la BBDD pero sí que este par de funciones tienen un menor impacto sobre el sistema haciendo mucho más rápida la consulta de obtener el número de registros.

NOTA: En nuestro php.ini el valor mysql.trace_mode debe estar en Off.

¿Que son los triggers?

9 de Enero de 2009

Se les llama triggers o disparadores, son eventos que se ejecutan cuando se cumplen condiciones determinadas, al hacer un insert, update o delete en una tabla de una BBDD. Esto nos permite realizar acciones cuando se realiza una inserción, modificación o eliminación de un registro. Son parecidos a los procedimientos almacenados pero en este caso no se tienen que llamar como los stored procedures, sino que como hemos dicho se ejecutan automáticamente al cumplirse la condición.

Los triggers pueden ser extremadamente útiles para llevar a cabo las siguientes casos:

  • Cuando los datos de una tabla son generados desde otro tipo de procesos y es necesario que se controlen los valores, para evitar que algunos campos tomen valores concretos.
  • Para duplicar los contenidos de una tabla automaticamente y en tiempo real.
  • Para implementar restricciones sobre valores que pueden tomar ciertos campos de la tabla.
  • Incrementar automáticamente los valores de un campo.
  • Para controlar las modificaciones de los valores de los campos.
  • Para realizar actualizaciones de una tabla en cascada.
  • Para modificar campos o registros en una tabla que un usuario no puede modificar directamente.

A continuación vamos a ver un par de ejemplos de triggers que se pueden ejecutar en tablas para realizar cualquiera de las siguientes operaciones.

En el ejemplo número 1 el trigger que hace un pedido en la tabla pedidos cuando  en el almacen se modifica un pedido y este valor es inferior al de un valor dado:

BEFORE UPDATE ON tabla_almacen

FOR ALL records IF :NEW.producto < 100 THEN INSERT INTO tabla_pedidos(producto) VALUES (‘1000′);

END IF;

SELECT DBO.POLVE.TEST

END

En el segundo ejemplo, si insertamos o actualizamos el registro de un empleado de manera que el salario sea superior a 5000 euros, el trigger actualizará el salario a 5000 euros idependientemente del valor que hayamos insertado o introducido al modificar el registro.

CREATE TRIGGER tr1_empleados

BEFORE INSERT OR UPDATE OF salario
ON empleados
FOR EACH ROW
WHEN (:new.salario > 5000);
BEGIN
UPDATE empleados
SET salario = 5000
WHERE empleado_id = :new.empleado_id;
END;

Con estos ejemplos ya nos podemos hacer una pequeña idea de que son los trigger y de cuáles son sus utilidades y virtudes de cara a incrementar su uso en los desarrollos que impliquen BBDD.