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

Share Button

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.

Share Button

BigDump: facilita recuperar dumps de MySQL grandes

A veces es un lío enorme recuperar BDs obtenidos de dumps cuando el fichero es enorme, sobre todo si usamos phpMyAdmin (y no tenemos acceso a él). Por ello este script nos puede venir muy bien para recuperar backups anteriores, ya que recupera de poco en poco y se auto-reinicia él mismo.

BigDump

Share Button

Lessn: script para acortar URLs

Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos. Lessn Vía / Script & Style
Share Button

Guía de escalamiento y replicación en MySQL

La gente de Sun ha publicado una guía muy interesante sobre escalamiento y replicación para MySQL. Se trata de un PDF que nos explica qué es el escalamiento, la replicación en MySQL, los tipos de escalamiento, el Linux Heartbeat y los cluster, entre otras cosas. Guía: Escalamiento de MySQL para negocios de alto crecimiento Gracias David por el aviso
Share Button

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

Share Button

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

Share Button

MySQL 5.4

Sun (o quizás Oracle) ha anunciado la salida de MySQL 5.4, la cual ya está disponible una preview para su descarga. Entre las novedades que ofrece encontramos:

  • Mejoras en escalabilidad
  • Optimización de subqueries
  • Nuevos algoritmos para sentencias
  • Mejoras en los procedimientos almacenados
  • Mejoras en el Information Schema

Sun Announces MySQL 5.4: Up To 90% Faster Response Times, and Scalability Up to 16-way x86 Servers and 64-way CMT Servers

Share Button

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

Share Button

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

Share Button