Descargar BLOB mediante streaming con MySQL

Scalable BLOB Streaming para MySQL es un plugin que transforma MySQL en un servidor capaz de enviar por streaming imágenes, películas, mp3s y otros ficheros directamente desde la base de datos.

Entre las ventajas que nos oferce, encontramos las siguientes:

  • Almacenar BLOBs de cualquier tamaño, actualmente solo se pueden almacenar dependiendo de lo que pueda tratar la memoria.
  • Enviar y recibir mediante streaming directamente de la base de datos.
  • Válido para cualquier sistema de almacenamiento MySQL
  • Provee un API estándar para desarrollar aplicaciones, que extiende al actual API.

Para acceder al contenido tan solo es necesario realizar una llamada HTTP:

http://servidor/basededatos/tabla/columna/condicion

Blogstreaming.org

Vía / PrimeBase XT

|

Laboratorio: triggers y procedimientos almacenados en MySQL

Unas opciones no muy usadas cuando se trabaja con MySQL son los triggers y los procedimientos almacenados (stored procedures), supongo que a que es algo nuevo en MySQL y la gente no está acostumbrada a estas dos funcionalidades.

Vamos a mostrar un ejemplo de uso de triggers y procedimientos almacenados paso a paso. Quizás el ejemplo no sea el más correcto, o simplemente sea poco útil, pero lo importante es el uso en sí, no el ejemplo.

Nuestro sistema tendrá dos tablas, una con ventas y la otra con comisiones. En la primera se almacenarán cada venta que se realiza en un comercio, y en la segunda las comisiones que le corresponden a cada vendedor en el momento.

CREATE TABLE `ventas` (
`vendedor` int(11),
`producto` int(11),
`importe` float
)
CREATE TABLE `comisiones` (
`vendedor` int(11),
`comision` float
)

Las comisiones se calcula de una forma especial, le corresponde un porcentaje de las ventas según el tipo de producto, y es importante para los vendedores el que se sepa en cada momento qué comisiones lleva ganadas (esto es una justificación para no usar un cron o algo parecido).

Para calcular qué comisión le corresponde a un vendedor, calcularemos los porcentajes para cada tipo de producto vendido y luego lo añadiremos/actualizaremos en la tabla de comisiones. Todo se realizará en un procedimiento almacenado.

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_comisiones`$$
CREATE PROCEDURE `test`.`sp_comisiones` (IN mivendedor INT)
BEGIN
DECLARE micomision INT DEFAULT 0;
DECLARE suma INT;
DECLARE existe BOOL;
select IFNULL(sum(importe),0) into suma from ventas where producto = 1 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.15);
select IFNULL(sum(importe),0) into suma from ventas where producto = 2 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.1);
select IFNULL(sum(importe),0) into suma from ventas where producto = 3 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.2);
select count(1)>0 into existe from comisiones where vendedor = mivendedor;
if existe then
UPDATE comisiones set comision = comision+micomision where vendedor = mivendedor;
else
insert into comisiones (vendedor, comision) values (mivendedor, micomision);
end if;
END$$
DELIMITER ;

Ahora, para actualizar los datos de las comisiones usaremos un trigguer, así cuando se haga una venta (insert en la tabla ventas), se llamará al procedimiento almacenado (sp_comisiones), que recalculará la comisión para ese vendedor.

DELIMITER $$
DROP TRIGGER `test`.`tr_ventas_insert`$$
CREATE TRIGGER `test`.`tr_ventas_insert` AFTER INSERT on `test`.`ventas`
FOR EACH ROW BEGIN
call sp_comisiones(new.vendedor);
END$$
DELIMITER ;
|

Ventajas de usar mysqli

A la hora de realizar aplicaciones PHP/MySQL, normalmente se suele utilizar la librería mysql, cuando existe la librería mysqli, la cual puede ser más eficiente.

Os paso 4 motivos que a mí me han parecido muy importantes:

  • Prepared statements: a parte de ser más cómodo a la hora de montar nuestras querys, ofrece mucha seguridad contra el SQL injected.
$mysqli = new $stmt = $mysqli->prepare("select usuario from usuarios where i = ?");
$stmt->bind_param('i',$id);
$stmt->execute();
  • Conexiones seguras: la posibilidad de usar mysqli_ssl_set() permite realizar conexiones seguras indicando detalles del certificado mediante los parámetros.
  • Múltiples querys: posibilidad de ejecutar varias querys separadas por punto y coma, en una conexión.
  • Interfaz orientado a objetos: esta característica permite al desarrollador ampliar el objeto para añadir nuevas funcionalidades más específicas. Por ejemplo se podrían separar los errores de operación (conexión) a los de desarrollo (querys mal formadas).

The Four Major Benefits of MySQLi

Vía / dzone

solidDB para MySQL

solidDB.gifsolidDB es una versión más rápida para MySQL que incluye el sistema de almacenamiento solidDB, el cual maneja mejor volúmenes de transacciones pesadas y un gran número de usuarios concurrentes.
Es compatible 100%, ya que incluye el mismo código que MySQL. Los desarrolladores pueden acceder a solidDB para MySQL con los mismos drivers de MySQL y usar las mismas herramientas que antes.
Está diseñada para tomar ventaja de las configuraciones multiprocesador y multicore. Debido a que está diseñado para multiples threads, los rendimientos para un número elevado de usuarios son mejores, habiendo datos que lo demuestran.
solidDB para MySQL

Optimizaciones para MySQL

Ya el otro día hablábamos sobre las optimizaciones que podríamos realizar en nuestro entorno LAMP referente a Apache y PHP. Ahora, la gente de IBM nos vuelve a ofrecer otro artículo en el que nos indican cosas que hacer para mejorar el rendimiento de nuestra base de datos MySQL.
Las mejoras que se pueden realizar se dividen en tres conceptos: optimizar la máquina, configurar el proceso de MySQL y optimizar las querys. El servidor de base de datos nos puede dar problemas ya que una base de datos consume muchos recursos, lo cual se puede solucionar en muchos casos mejorando la CPU y la velocidad de disco duro, y si no, aumentar la RAM, cosas lógicas y normales.
Para la optimización de MySQL y el tratamiento de las querys lentas, se pueden realizar varias acciones. La primera de ella sería tener un log de qué querys emplean mucho tiempo en ejecutarse, para lo cual deberemos cambiar en la configuración de MySQL el parámetro log-slow-queries para que se guarden qué querys tardan más de cierto tiempo.
Otro tema importante es cachear las querys que se realizan, para ello hay dos formas, la que nos cuentan en el artículo, que es mediante configuración, y la otra que es mediante código, porque si lo realizamos mediante código podemos controlar mejor que querys cacheamos.
Al igual que ocurre en Apache, en MySQL es importante controlar el número máximo de conexiones, el timeout y el número máximo de errores, ya que si configuramos mal estos valores nos podemos encontrar con rendimientos poco deseados.
En total, una serie de recomendaciones muy buenas que debemos tener en cuenta cuando nuestra aplicación web requiere ajustar los recursos al máximo.
Tuning LAMP systems, Part 3: Tuning your MySQL server

Pros y contras de MySQL

MySQL es una de las bases de datos más populares que hay dentro del desarrollo web. Hay gente que la defiende, y otros que no la tienen entre sus BD favoritas. Para aquellos que tengan que decidirse en la elección de MySQL como BD de su sistema, esta lista de pros y contras le puede ser de mucha utilidad.

Pros

  • Es muy popular: el hecho de que mucha gente la use y que esté tan presente en gran parte de los desarrollos web, hace que los proveedores de software intenten que sus aplicaciones sean compatibles con esta BD, pudiendo así encontrar muchas aplicaciones para MySQL.
  • Es simple: es fácil de aprender comparada con otras BDs, no es necesario emplear mucho tiempo o dinero en formar a los trabajadores o en contratar a gente cualificada. El que sea sencilla conlleva que también sea rápida, aunque hay algunos desarrolladores que echan en falta algunas funcionalidades (a mi parecer, cada vez menos).
  • Es barata: aunque pertenece a MySQL AB, MySQL es open source, que sea barata implica que al inicio del proyecto el gasto vaya a otras partes que puedan necesitarlo, en vez de gastar dinero en licencias.
  • Tiene soporte: uno de los inconvenientes que suelen presentar los clientes hacia el open source es que no dispone de soporte. MySQL ofrece licencia con servicios de soporte y mantenimiento, además también es posible obtener atención técnica 24/7.
  • Es flexible y escalable: dispone de muchos tipos de almacenamiento, pudiendo seleccionar el que más nos convenga, y os procedimientos almacenados nos permiten escalabilidad.
  • Librerías nativas para lenguajes: ofrece librerías para lenguajes como PHP y Ruby.

Contras

Yo no estoy personalmente de acuerdo con todas ellas, pero quien escribe el artículo tiene sus razones para indicarlas y hay que tenerlas en cuenta.

  • Licencia GPL: en algunos entornos, la licencia BSD es más adecuada.
  • Falta de integración con entornos existentes: existen muchas circustancias en los que los DBA no tienen un entorno con el que tratar con MySQL.
  • Falta de madurez: en comparación con otras BDs como Oracle (que cumple 30 años), le falta madurez, lo que indica posicionamiento y estabilidad.
  • Falta de características: hay características importantes, que aunque a veces no son muy utilizadas, pueden acabar con un proyecto debido a la necesidad de uso.
  • Certificación: a muchas empresas les gusta la certificación, aunque ofrecer certificación, esta está muy lejos de parecerse a la de Oracle o MS-SQL Server.

Five Compelling Reasons to Use MySQL

Eight Sound Reasons Not to Use MySQL

Vía / dzone

|

Google ofrece sus modificaciones a MySQL

google_mysql.pngGoogle, usuario de MySQL, ha publicado los cambios que ha realizado a la base de datos MySQL. Los cambios están destinados a mejorar la disponibilidad y la manejabilidad.
La disponibilidad se refiere a permitir que los servicios sigan ejecuntándose aunque el servidor donde está funcionando falle, cambiando a una máquina backup cuando falle.
Aunque los cambios no han sido aceptados en el proyecto MySQL, Google quiere que si se acepten, y hasta que esto ocurra, han publicado los cambios con la misma licencia de MySQL para que la gente pueda disfrutar de ellos.
Google offers its own changes to MySQL

|

10 consejos para mejorar tus queries MySQL

10 interesantes consejos a seguir para mejorar nuestras sentencias en MySQL, algunas de ellas para poder optimizar las ya creadas.

  • Usa el comando explain: el comando explain te puede ayudar a identificar los índices que se usan y además te proporciona más información útil.
  • Usa permisos menos complejos: usar permisos más sencillos evita que se comprueben muchas condiciones en cada ejecución de una sentencia.
  • Comando benchmark: este comando nos permite saber cuánto tiempo tarda en ejecutarse una expresión.
  • Optimiza tus cláusulas: ya sea quitando paréntesis innecesarios, usando count(*) sin condiciones en el where ya que tira de tablas internas de MyQSL o usando la opción SQL_SMALL_RESULT para usar tablas temporales en memoria.
  • Ejecuta optimize table: defragmenta una tabla después de varios borrados, el acceso a disco es algo importante a tener en cuenta.
  • Evita campos de longitud variable: en tablas de frecuente actualización evita campos como VARCHAR, BLOB o TEXT.
  • Usa insert delayed: solo cuando sea no importe cuando se inserten los datos.
  • Prioridades en las sentencias: usa INSERT LOW_PRIORITY para darle a las consultas mayor prioridad, o usa SELECT HIGH_PRIORITY para ejecutar una consulta aunque haya otros clientes esperando.
  • Haz múltiples inserciones en una única sentencia: en vez de varias sentencias de una única inserción.
  • Sincroniza tipos de datos: mismos datos en tablas diferentes deben ser del mismo tipo de datos.

Yo siempre he tenido una duda, que no he resuelto por pereza, sobre el caso de ejecutar count(*) o count(1). La leyenda urbana dice que es mejor count(1), ya que de la otra forma obtienes que enviar todas las columnas, al igual que haces en un select *. Un consultor en Oracle nos dijo que era falsa esa afirmación porque tardaba lo mismo, yo creo que también, entre otras cosas porque seguro que ese punto está optimizado, pero claro, que sea consultor o que sea de Oracle no quiere decir nada, y menos aún si hablamos de otras bases de datos.

10 tips for optimizing mysql queries

Vía / Alex Sancho

| |

Usar polimorfismo en PHP5 para acceder a diferentes BD

Gracias al tratamiento de objetos que nos permite PHP5, es posible diseñar aplicaciones de una forma más eficiente. Un caso de ello es el polimorfismo, lo cual va a permitir acceder y trabajar con diferentes tipos de bases de datos de una forma única.
En el artículo en el que hacemos referencia, explican detalladamente cómo usar el polimorfismo para acceder a datos mediante MySQL y SQLite. Para ello se crearán una clase abstracta y dos clases que extenderán de esta, siendo cada una de estas las encargadas de tratar el acceso a MySQL o a SQLite.
Después se deberá crear una clase que maneje estas clases, dependiendo de un parámetro, se usará una de las clases (MySQL o SQLite). Esta última clase será la que instancie el usuario final, por lo que para él será transparente el tratamiento que se haga de una u otra base de datos.
Algo que también destacaría de este artículo es la forma de no hacerlo, algo que me he encontrado en alguna ocasión en Java (donde hay polimorfismo desde siempre). La forma incorrecta de hacerlo es creando una única clase y diferenciando en cada método diferentes códigos dependiendo de si se trata de una BD u otra.
Abstracting Database Access Using Polymorphism with Objects in PHP 5

MySQL Migration Toolkit

mysql.pngEl otro día nos preguntaban una forma de migrar una base de datos Access a otra MySQL. En ese momento no conocía ninguna aplicación que pudiera hacerlo, pero hoy me he enterado que los propios de MySQL tienen MySQL Migration Toolkit, que permite mediante una serie de pasos realizar una migración de forma correcta.
mysql_migration.png
Entre las base de datos que podemos migrar nos encontramos: Oracle, Microsoft SQL Server, Microsoft Access y otras. A parte reduce riesgos usando una metodología, ahorra costes incrementando la productividad, elimina días de trabajo de querys manuales, test y debug.
He visto también en en artículo desde el que hacemos referencia, que MySQL Workbench, del que hicimos referencia en su día, no está disponible para su descarga como lo estaba anteriormente, esperemos que sea porque anden mejorando este producto.
MySQL Migration Toolkit
Vía / Conexiones Razonables