Columnas virtuales en MySQL

MySQL está trabajando en un tipo nuevo de columnas las cuales pueden resultar muy útiles. Se trata de columnas virtuales, las cuales tienen un valor automático dependiente de una función.

Con un ejemplo se puede entender mejor:

create table t1 (
a enum('A','B','C'),
b int,
c virtual int as (if(a<>'A',null,b)) stored unique);

Como se puede ver, el campo c tendrá valor null si el campo a es distinto de ‘A’ y el valor del campo b en el resto de los casos.

¿Qué nos puede aportar esto?, pues mayor velocidad en queries que usen índices funcionales, simplicidad en queries usadas con frecuencia y el uso de índices basados en funciones.

También se podría hacer mediante el uso de triggers, pero si el dato se actualiza, este permanerá igual con triggers y cambiará automáticamente con el uso de las columnas virtuales. También se podrían usar vistas, pero es menos eficiente ya que se crean más objetos usando vistas.

Existen algunas restricciones como que solo se puede usar en MyISAM y InnoDB, pero aún así, estoy deseando poder echar mano a este tipo de columnas.

MySQL virtual columns preview

GreenSQL: proxy que protege MySQL de SQL injections

GreenSQL es un reverse proxy que se sitúa entre tu aplicación web y la BD de MySQL y evita que se realicen ataques de SQL injection en nuestra BD.
greensql.png
La lógica está basada en la evaluación de los comandos SQL usando una matriz de puntuación de riesgo, a parte de bloquear comandos de administración (DROP, CREATE, …).
Tiene muy buena pinta, claro que habría que hacer unas pruebas de rendimiento para ver si es más eficiente evitar los ataques mediante código o mediante GreenSQL.
GreenSQL

Tareas típicas para el mantenimiento de MySQL

Tareas que se deberían ejecutar para el mantenimiento de la base de datos de MySQL:

  • Backup: hay que realizarlo de los ficheros de datos, ficheros de logs de transacciones, ficheros de configuración y logs binarios.
  • Limpiar los logs binarios: Se puede hacer mediante my.conf usando expire_logs_days o mediante la sentencia PURGE MASTER LOGS. Eso sí, no purgar los logs que necesiten los esclavos, ni borrarlos mediante un comando de un fichero (rm bin-log.*).
  • Optimizar las tablas: después de inserts y updates las tablas se llenan de espacio inútil, por lo que es necesario optimizar las tablas usando OPTIMIZE TABLE.
  • Vaciar la caché: cuando se ejecutan selects con tamaños diferentes de resultados, el cache se defragmenta, lo cual hace necesario que se vacie la cache (FLUSH QUERY CACHE).
  • Rotar los logs binarios: los logs binarios solo se rotan por tamaño, si quieres hacerlo en un determinado momento se debería usar la sentencia FLUSH LOGS.

Typical automated MySQL maintenance jobs

SQL Buddy: administrador web de MySQL

SQL Buddy es un administrador de MySQL que usa Ajax para cargar los datos por lo que el número de consultas disminuye. A parte de mostrar una interfaz sencilla de usar.
sqlbuddy.png
Permite importar y exportar datos, administración y gestión de tablas y algunos detalles más. No parece ser tan completo como phpMyAdmin, pero sí que es suficiente para lo que muchas veces necesitamos.
Es compatible con PHP 4.3+, MySQL 4+, Firefox, Safari, Opera 9.5 e Internet Explorer 7.
SQL Buddy

Drizzle: MySQL para la web

Drizzle es de lo que más se está hablando últimamente dentro de los blogs sobre MySQL. Se trata de un motor de base de datos pensado para la web. Basado en MySQL 6, pretende llegar a ser más rápido que MySQL y admitir mucha concurrencia.

En base inicial, creado por una comunidad de desarrolladores liderado por uno de los fundadores y desarrolladores iniciales de MySQL, elimina de MySQL6 los triggers, procedimientos almacenados, las vistas, control de acceso, caché de queries y prepared statements, tan solo MyISAM con índices FULLTEXT.

Tiene muy buena pinta, ahora a ver a qué llega el desarrollo.

Más información

Drizzle

Flexviews: vistas materializadas en MySQL

Las vistas materializadas son aquellas vistas que se almacenan en una tabla de la base de datos. MySQL no provee de estas vistas, pero Flexviews lo simula mediante procedimientos almacenados que se ejecutan mediante triggers.
Flexviews

|

Script PHP para sincronizar estructuras de BD MySQL

Interesante script que permite dados dos estructuras del MySQL, obtenidas por ejemplo usando un mysqldump, ver que diferencias hay entre ambos y devuelve las queries necesarias para igualar las dos estrucuras.

Por ejemplo, si tenemos la estructura siguiente:

CREATE TABLE IF NOT EXISTS `archive` (
`id` int(11) NOT NULL auto_increment,
`topFile` varchar(255) NOT NULL default '',
`msgId` int(11) NOT NULL default '0',
`time` timestamp NOT NULL default CURRENT_TIMESTAMP,
`topTpl` varchar(255) NOT NULL default '',
`file` varchar(255) NOT NULL default '',
`template` varchar(255) NOT NULL default '',
`instanceKey` varchar(255) NOT NULL default '',
`orderby` varchar(25) NOT NULL default '',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10256 ;

Y este otro:

CREATE TABLE IF NOT EXISTS `archive` (
`id` int(11) NOT NULL auto_increment,
`topFile` varchar(255) NOT NULL default '',
`msgId` int(11) NOT NULL default '0',
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`topTpl` varchar(255) NOT NULL default '',
`file` varchar(255) NOT NULL default '',
`template` varchar(255) NOT NULL default '',
`instanceKey` varchar(255) NOT NULL default '',
`encoding` varchar(50) NOT NULL default '',
`orderby` varchar(255) NOT NULL default '',
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10256 ;

Nos devolvería las siguientes sentencias:

ALTER TABLE `archive` ADD `encoding` varchar(50) NOT NULL;
ALTER TABLE `archive` MODIFY `orderby` varchar(255) NOT NULL;
ALTER TABLE `archive` MODIFY `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP;
ALTER TABLE `archive` DROP PRIMARY KEY;

Un script bastante útil cuando, debido al despiste, tenemos diferencias entre la base de datos de desarrollo y la de producción y no sabemos qué cambios hemos realizado.

Database structure synchronizer

Monolith: consola DBA para MySQL

Monolith es una consola para DBAs de MySQL que programa y automatiza backups para MySQL y monitoriza un número ilimitado de servidores para medir y mejorar su rendimiento. Además genera gráficas para ser utilizadas para informes.
monolith.png
Entre las características que ofrece nos encontramos con la posibilidad de crear enviar informes locales de backups a la consola de monolith, múltiples gráficas, informes HTML, exportación de datos, integración con VisualMining, backups remotos, envío de informes por email.
Monolith – MySQL DBA Console 1.4 Released

jHeidi: cliente MySQL multiplataforma

jHeidi es una versión de Heidi realizado en Java para que se pueda ejecutar en otras plataformas y no solo en Windows.

jheidi.png

Entre las características que ofrece nos encontramos con:

  • Navegador de bases de datos, tablas y campos
  • Crear, actualizar y borrar BD, tablas, campos e índices
  • Ventana para queries
  • Administrador de usuarios
  • Mantenimiento de tablas
  • Administrador de conexiones
  • Exportar datos (CSV, HTML, …)
  • Importar CVS

jHeidi

mytop: clon de top para MySQL

mytop es una aplicación para la línea de comandos que ofrece información de MySQL al estilo del comando top de Unix. La información que devuelve está dividida en dos partes, una primera que muestra la información del servidor y otra que mostraría la información que proporciona el ejecutar PROCESS LIST: id, usuario, query, tiempo, host y base de datos.
mytop.png
Funciona para las versiones de MySQL 3.22.x, 3.23.x, y 4.x (no sé si funciona para 5 porque la ultima versión es de febrero del 2007) y se necesita disponer de Perl 5.005, Getopt::Long, DBI y DBD::mysql, y Term::ReadKey para CPAN.
mytop