Hacer un split en MySQL

Normalmente no se suelen necesitar hacer splits en MySQL, porque un buen diseño de la BD debería almacenar los campos en distintas columnas, y si no se puede realizar así, se suele guardar la información serializada en PHP o en formato JSON o XML. Pero no siempre son las cosas como queremos y alguna vez nos podemos encontrar con la necesidad de hacer un split de un campo en MySQL (como me ha pasado a mi ahora).

Hacerlo es fácil, solo es necesario hacer dos substrings, por cada campo:

SELECT `ip` ,
SUBSTRING_INDEX( `ip` , '.', 1 ) AS a,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS b,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS c,
SUBSTRING_INDEX( `ip` , '.', -1 ) AS d
FROM log_table

MySQL String Functions

INSERT IGNORE en MySQL

Muchas veces realizamos inserts y nuestras comprobaciones son erróneas e intentamos insertar registros duplicados, dándonos un error gordo en MySQL. Para evitar esto, normalmente se usa un REPLACE cuando la situación permite reemplazar los valores nuevos por los actuales, pero cuando esto no es posible, nos tenemos que pegar con el código buscando la comprobación que no hacemos correctamente. Para evitar esto: insertar algo ya existente, MySQL ofrece la posibilidad de ignorar el insert cuando no se puede insertar:

INSERT IGNORE 
  INTO tabla 
    (id, valor, ...) 
  VALUES 
    (25, 'valor, ...)

Cada día aprendo algo nuevo, aunque a veces deberían darme con la Biblia de MySQL (775 páginas) en la cabeza por no conocer antes esto.

phpMyBackupPro: realiza backups de MySQL

phpMyBackupPro es un sistema que nos permite controlar las backups de nuestra BD MySQL de forma sencilla.

Entre las características que ofrece nos encontramos con:

  • Backups de una o varias BD con datos, sin datos, estrutura de las tablas, …
  • Tres tipos de comprensión: sin comprensión, gzip o zip
  • Backups programables
  • Administración de backups que permite verlas, recuperarlas, descargarlas o borrarlas
  • Backup en servidor FTP o envío por email
  • Modo shell

phpMyBackupPro

Vía / Weblenium

Mostrar el tiempo transcurrido con MySQL

Algo muy común a la hora de realizar una aplicación web es indicar las fechas según el tiempo transcurrido, en vez de poner 2009-06-03 poner “hace 7 días”.

Para aquellos que necesiten mostrar las fechas de esta forma usando MySQL es posible hacerlo usando una función:

DELIMITER //
CREATE FUNCTION TimeDiffUnits (old DATETIME, new DATETIME) RETURNS CHAR(50) DETERMINISTIC NO SQL
BEGIN
DECLARE diff INTEGER;
SET diff = UNIX_TIMESTAMP(new) - UNIX_TIMESTAMP(old);
CASE
WHEN (diff < 3600) THEN
RETURN CONCAT(FLOOR(diff / 60) , ' Minutes');
WHEN (diff < 86400) THEN
RETURN CONCAT(FLOOR(diff / 3600), ' Hours');
WHEN (diff < 604800) THEN
RETURN CONCAT(FLOOR(diff / 86400), ' Days');
WHEN (diff < 2592000) THEN
RETURN CONCAT(FLOOR(diff / 604800), ' Weeks');
WHEN (diff < 31536000) THEN
RETURN CONCAT(FLOOR(diff / 2592000), ' Months');
ELSE
RETURN CONCAT(FLOOR(diff / 31536000), ' Years');
END CASE;
END //
DELIMITER ;

Importante: no uséis jamás está función ni en el WHERE ni en el ORDER BY ni en el GROUP BY, ya que se ejecutaría para cada registro de las tablas.

User Friendly Age Function for MySQL

5 consejos para optimizar sentencias en MySQL

Interesantes consejos a tener en cuenta cuando realizamos nuestras aplicaciones usando MySQL:

  • Optimización de tipos: intenta evitar el uso de NULLs ya que requieren más operaciones internas en MySQL. Usa el tamaño correcto para las variables, por ejemplo, si vas a usar un número pequeño no uses INT.
  • Cuidado con la codificación de caracteres: inserta los datos siempre en la misma codificación, si tienes orígenes con diferentes codificaciones modificalo antes de insertar.
  • Optimización de COUNT: COUNT(*) sin un WHERE no necesita acceder a la tabla para obtener los resultados, al igual sin en vez de asterisco usamos un campo de la tabla que no tenga valores NULL. En el caso de que haya WHERE, poco se puede hacer para optimizar la consulta salvo usar índices correctamente.
  • Optimización de subqueries: MySQL no optimiza muy bien las subqueries por lo que es preferibles pasarlas a una JOIN. Incluso realizar dividir en dos queries independientes puede ser una buena alternativa.
  • Optimización de UNION: UNION devuelve la unión de los datos de dos tablas que no se hayan en la otra, por lo que realizan un UNIQUE y una ordenación. Usa UNION ALL si estás seguro de que las distintas consultas no tienen datos repetidos (o no te importa que esté repetidos).

Five Query Optimizations in MySQL

openark kit: utilidades DBA para MySQL

openark kit es una serie de scripts en Python que nos facilitará las tareas de DBA (sobre todo para aquellos que no es nuestro fuerte). Consta de las siguientes aplicaciones:

openark kit