Concatenar dos campos en MySQL

Hoy, estaba hablando con un compañero mío sobre una consulta que estaba intentando hacer y no conseguía de ninguna de las maneras.

Lo que quería hacer era juntar dos columnas o campos de una tabla de mysql para poder buscar una cadena en dichos campos. Por ejemplo: Pongámonos en el caso de que tenemos una tabla de personas y dos campos: uno para el nombre y otro para los apellidos y queremos buscar sobre esas personas sobre esos dos campos pero unificados y mostrarselos como un único campo, como lo haríamos?

Pues utilizando la función concat_ws de mysql. Está función permite concatenar dos o más campos para mostrarse como un único campo.

Veámos un ejemplo:

SELECT concat_ws(' ', nombre, apellidos) as persona FROM personas;

Esta consulta nos devolvería un único campo en el que se han juntado el nombre y los apellidos y utilizando el espacio como caracter de separación, en vez del espacio podemos utilizar cualquier carácter, por ejemplo:

SELECT concat_ws(' ,', nombre, apellidos) as persona FROM personas;

El resultado sería:

Esteban, García García

Si también queremos utilizar este campo concatenado dentro de WHERE tendremos que utilizar el concat_ws porqué WHERE no sabe que existe un campo concatenado, por lo que quedaría así:

SELECT concat_ws(' ', nombre, apellidos) as persona FROM personas WHERE concat_ws(' ', nombre, apellidos) LIKE '%cadena%';

Con el ejemplo anterior buscaría todas las personas que tuvieran la palabra <cadena> y mostraría el nombre completo de la persona.

Podéis encontrar más información en el siguiente enlace:

Concatenar campos en mysql

Detectar consultas lentas en MySQL

Es posible que, a veces, las páginas web alojadas en nuestro servidor tarden mucho en cargarse. Si nuestras páginas utilizan MySQL, es posible que algunas consultas no sean óptimas y esto sea la causa de la lentitud de las mismas.

A medida que crecen las aplicaciones es más difícil localizar qué consultas son las que están ralentizando nuestro servidor, y localizar el problema puede ser un trabajo largo y complicado.

Afortunadamente, el propio MySQL nos facilita esta tarea, brindándonos la posibilidad de obtener un registro completo de las consultas lentas que se ejecutan en nuestro servidor. Para ello, tan solo debemos activar el log de consultas lentas para que MySQL las vaya recopilando y así poder ver cuáles son aquellas que más se repiten y poder actuar en consecuencia.

Para activar el log de consultas lentas, accedemos por SSH a nuestro servidor y abrimos el archivo de configuración de MySQL para modificarlo:

pico /etc/mysql/my.cnf

Localizamos las líneas donde se configura el log:

# Here you can see queries with especially long duration
#log_slow_queries        = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes

Y descomentamos las líneas que nos interesen. Este es el significado de cada una de ellas:

- log_slow_queries: indicamos el nombre del fichero que creará el servidor.
- long_query_time: indicamos el valor, en segundos, a partir del cual MySQL ha de considerar que una consulta es lenta.
- log-queries-not-using-indexes: si descomentamos esta línea, MySQL también almacenará en el log aquellas consultas que no utilizan ningún índice.

En nuestro ejemplo, solo vamos a descomentar las dos primeras líneas, indícandole que guarde en el log aquellas consultas cuyo tiempo de ejecución supere los 2 segundos. Por tanto, las líneas quedarían así:

# Here you can see queries with especially long duration
log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 2
#log-queries-not-using-indexes

Guardamos el fichero y reiniciamos el servicio MySQL:

/etc/init.d/mysql restart

A partir del reinicio, MySQL empezará a recoger en el fichero de log aquellas consultas que tarden más de 2 segundos en ejecutarse.

Ahora solo queda esperar a que se recojan los suficientes datos para poder tener un listado completo de aquellas consultas que están dando problemas.

Para consultar el log, MySQL también nos proporciona una herramienta: mysqldumpslow. Con ella, podremos leer el log filtrando y ordenando los resultados de forma que nos resulte fácil interpretar los datos. Por ejemplo, una lectura común es que sólo queramos ver las 15 consultas más lentas almacenadas en el log. Para ello utilizaremos la siguiente línea de comandos:

mysqldumpslow -s c -t 15 /var/log/mysql/mysql-slow.log

Con la opción “-s” indicamos el criterio de ordenación (en el ejemplo, “c” es por número de ejecuciones de la consulta) y con “-t” indicamos el número de consultas que nos ha de mostrar en pantalla (en nuestro ejemplo serán 15).

Para ampliar la información, podéis dirigiros a la página oficial de MySQL sobre el log de consultas lentas o consultar al detalle el uso de mysqldumpslow (en inglés).

¡Esperamos que os sirva de ayuda!

Nota: las rutas utilizadas pueden variar dependiendo de la distribución Linux instalada en el servidor.

Como conectarse a MySQL desde línea de comandos

Con este tip podremos conectarnos a la consola de mysql y poder ejecutar culquier consulta de SQL o realizar tareas de mantenimiento sobre nuestras bases de datos.

mysql --host=<SERVIDOR> --user=<USUARIO> --password=<PASSWORD>

ó bien

mysql -h <SERVIDOR> -u <USUARIO> -p

Hay que cambiar lo que hay entre “< >” por vuestros datos.

Un ejemplo:

mysql --host=localhost --user=test --password=123456

En el segundo tip no incluímos la contraseña, por lo que cuando lanzemos el comando el sistema esperará a que la pongamos para poder conectarnos.

Luego, una vez dentro podemos utilizar cualquier consulta de SQL cómo:

show databases

Para poder gestionar una base de datos en concreto introduciremos en la linea de comandos de mysql lo siguiente:

use <BASE_DE_DATOS>

Dentro de la base de datos podremos realizar cualquier consulta como:

show tables

También podemos utilizar una base de datos en la linea de conexión a mysql, por lo que la linea quedaría así:

mysql --host=<SERVIDOR> --user=<USUARIO> --password=<PASSWORD> --database=<BASE_DE_DATOS>