| |

Sphinx: buscador de texto open source

sphinx.pngSphinx (SQL Phrase Index) es un motor que permite buscar texto. Normalmente es un motor de búsqueda independiente, que provee de forma rápida y eficiente resultados relevantes a otras aplicaciones. Está diseñado para ser integrado con MySQL y lenguajes de programación (actualmente PHP). Los datos se pueden recuperar mediante conexión directa a MySQL o mediante XMLs.

Dispone de cuatro utilidades: indexer para crear índeces de texto, search para buscar desde la línea de comandos, searchd es un demonio que busca en los textos desde aplicaciones externas y sphinxapi un API para lenguajes de programación (PHP).

Entre las características que ofrece nos encontramos con lo siguiente:

  • Alta velocidad de indexación (+10Mb/s)
  • Alta velocidad de búsqueda (0.1 s. en 2-4 Gb de texto)
  • Alta escalabilidad
  • Soporte para búsquedas distribuidas
  • Soporte para MySQL nativo (admite tablas MyISAM y InnoDB)
  • Búsqueda de frases
  • Stemming de inglés y ruso
  • Y mucho más

Sphinx

Vía / MySQL Performance Blog

MySQLToolKit: utilidades MySQL para la línea de comandos

MySQLToolKit es una serie de utilidades de línea de comandos esenciales para MySQL. Totalmente independientes, no se necesita ninguna aplicación externa, ni ser instalados, solo es necesario ejecutarlos.

Entre las utilidades que ofrece, nos encontramos con:

  • Table Checksum: comprueba si existen los mismos datos en dos tablas. La única forma de comprobar si las tablas esclavas están sincronizadas.
  • Table Sync: ofrece dos algoritmos que aseguran sincronización entre tablas aunque no estén en el mismo servidor.
  • Query Profiler: analiza querys normales, en batch, aplicaciones externas y comandos. Recopila datos de diversas fuentes para mostrar un informe de resultados con sentido.
  • Archiver: almacena filas de una tabla en otra tabla o en un fihero.
  • Deadlock Logger: recupera datos del último deadlock InnoDB y lo almacena en un fichero o en una tabla.
  • Duplicate Key Checker: encuentra índices o claves foráneas que estén total o parcialmente duplicadas.
  • Show Grants: te ayuda a extraer, comparar, cambiar, sincronizar y llevar una control de versiones de los privilegios de los usuarios.
  • Slave Restart: monitoriza la replicación de los esclavos por si ha habido error y si es así los reinicia.

MySQLToolKit

Vía / Xaprb

MONyog: monitor de MySQL

MONyog es un monitor web de MySQL, que nos permite identificar problemas MySQL de forma rápida y sencilla. Se trata de una aplicación que monitoriza el servidor MySQL y lo muestra con servidor web independiente que nos muestra muchos datos de nuestra, localizado en el puerto 9999, sin poder seleccionar el que queramos.
monyog.png
Entre las opciones que nos ofrece encontramos información general de la BD, historial de conexiones, caché Innodb, logs Innodb, caché de querys, tablas y threats, querys lentas, tráfico de red y muchas cosas más.
MONyog

|

HeidiSQL: cliente para MySQL

heidisql.pngHeidiSQL es un cliente open source para MySQL que permite manejar y visualizar las bases de datos y las tablas de MySQL. Algo parecido a lo que ya hacen MySQL Query Browser o SQLYog.

heidisql2.png

Entre las características que nos ofrece encontramos lo siguiente:

  • Generar informes SQL
  • Sincronizar tablas entre dos bases de datos
  • Manjar privilegios de usuarios
  • Importar ficheros de texto
  • Exportar los datos de una tabla en formato CSV, HTML o XML
  • Visualizar y editar los datos de una tabla
  • Insercion de ficheros ascii o binarios
  • Editor SQL con sintaxis resaltada y autocompletado
  • Monitorizar y eliminar procesos cliente

Además existe una versión portable

HeidiSQL

Devolver XMLs mediante MySQL

Existen bastantes ocasiones en los que el envío de información mediante XML es necesario, por ejemplo web services. Normalmente los datos que necesitamos enviar están almacenados en la base de datos, si necesitamos enviar esos datos en formato XML, normalmente solemos recuperar los datos en formato normal y luego transformarlo a XML mediante nuestro lenguaje de programación (por ejemplo PHP).
En este caso, mediante MySQL y los procedimientos almacenados, podemos crear una consulta que devuelva cada registro en formato XML, aunque habrá que incluirlo entre una etiqueta padre y añadirlo la cabecera XML (<?xml version …).
Las funciones que nos ofrece el autor son tres: xml_escape para remplazar caracteres no permitidos en un XML, xml_attr para crear un atributo XML y xml_tag para crear una etiqueta XML.
XML output from MySql

MySQL Proxy: para optimizar tu base de datos

mysqlproxy.pngMySQL Proxy es una aplicación, aún en fase inicial, que se sitúa entre tu aplicación y MySQL. Permite monitorear, analizar y transformar las comunicaciones. Su flexibilidad permite un número ilimitado de usuarios, a parte de incluir balanceo de carga, failover, análisis de querys, filtrado y modificación de querys y mucho más.
Disponible para Linux, Mac OSX, FreeBSD, IBM AIX y Sun Solaris, mientras que en Windows aún no está disponible por haber problemas con la librería libevent, pero estará disponible en breve.
MySQL Proxy

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 ;

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