MySQL 8.0 - Conoce las Principales Características de esta Nueva Versión

Ronaldo B.27 de julio de 202210 min de lectura

En este artículo

MySQL es una de las bases de datos más populares del mundo. Completamente open-source, se usa mucho en el desarrollo web, debido a la simplicidad de su conexión con los lenguajes de programación más utilizados en el mercado. En este artículo veremos las principales novedades de la versión 8 de esta base de datos, lanzada en 2018.

1 - Rendimiento

Una de las grandes novedades de la versión 8 de MySQL sin duda es su rendimiento. Se estima que esta versión es hasta 2x más rápida que la versión 5.7 y puede alcanzar la impresionante cifra de hasta 1,8 millones de consultas por segundo. Un número muy expresivo, ¿no crees?

2 - OpenSSL

La seguridad es un tema muy importante cuando se lanzan nuevas versiones de cualquier programa. Con MySQL no es diferente. La versión 8 implementó OpenSSL como la biblioteca estándar para sus protocolos TLS / SSL. Esto significa que esta versión es aún más segura, dado que OpenSSL es una biblioteca ampliamente utilizada y muy confiable para proteger el acceso a la base de datos.

3 - UTF-8

Uno de los grandes problemas que siempre hemos tenido al trabajar con versiones más antiguas de MySQL era la cuestión de la codificación y la acentuación de las palabras. Sin embargo, con el lanzamiento de la versión 8, el equipo de MySQL dio un gran paso para ayudarnos a resolver este problema. Ahora, todas las tablas tendrán la codificación utf8mb4 definida como predeterminada.

Esto facilitará bastante la comunicación de MySQL con lenguajes de programación, como PHP, sin que tengamos que preocuparnos por definir el UTF-8 en sus datos.

4 - InnoDB

Otro problema que nos daba muchos dolores de cabeza y que ahora podemos despedirnos con el lanzamiento de la versión 8 es la cuestión de los errores en las transacciones en MySQL. Para que funcionen correctamente, necesitamos definir el motor de las tablas como InnoDB. En las versiones anteriores de MySQL, teníamos que realizar esta definición en todas las tablas al crearlas; y si olvidábamos alguna tabla, las transacciones no funcionarían.

Pero, a partir de la versión 8, este motor es el predeterminado en todas las tablas, lo que es una excelente noticia.

Hablamos con más detalles sobre transacciones en MySQL 8 en nuestro canal de YouTube.

5 - JSON

JSON se ha convertido en los últimos años en una forma casi universal de realizar el intercambio de datos e información entre servidores, siendo un buen sucesor de XML. Y ahora, esta notación de objetos en JavaScript también está presente en MySQL, como un nuevo tipo de dato introducido en la versión 8. Esto nos abre un abanico de posibilidades relacionadas con cómo almacenar múltiples informaciones en una sola columna en nuestra base de datos.

Para ver cómo funciona, ¿qué te parece un pequeño ejemplo?

Vamos a crear una tabla de usuarios que contendrá el nombre y las fotos del usuario.

Usaremos el siguiente script:

CREATE TABLE users (
	id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(256) NOT NULL,
	photos JSON NOT NULL,
	register TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP()
);

Observa que la columna “photos” es del tipo JSON. Vamos a realizar la inserción de una fila en esta tabla, con el siguiente script:

INSERT INTO users VALUES (NULL, 'Djalma Sindeaux', '{"photo1": "images/dj.png", "photo2": "images/perfil.png"}', DEFAULT);

Estos datos serán insertados en nuestra tabla, incluyendo el JSON con las fotos del usuario. Teniendo en cuenta este escenario, podríamos conectar esta tabla con un lenguaje de programación y transformar el JSON de fotos en un array, lo que facilitaría bastante mostrarlas a nuestro usuario.

Lo más interesante del tipo de dato JSON es que realiza la validación de la cadena que se está informando en el momento de la inserción. Si el JSON está en un formato inválido, se devolverá un error.

En este artículo usamos el ejemplo de un JSON de fotos, pero este nuevo recurso podrá ayudarnos en muchas otras situaciones.

6 - “SELECT reducido”

El comando SELECT es uno de los más utilizados cuando estamos trabajando en MySQL. De hecho, en la versión 8 se introdujo un nuevo recurso que nos permite ejecutar este comando con un script más pequeño.

Ahora, si tenemos un comando SELECT * FROM, podemos sustituirlo simplemente por TABLE. Ten en cuenta que solo estamos hablando del SELECT de todas las columnas de la tabla.

Usaremos la tabla que creamos arriba como ejemplo. En lugar de ejecutar SELECT * FROM users, podemos usar el script TABLE users. Mucho más conciso, ¿no es verdad?

Sin embargo, cuando hablamos de cláusulas con el comando TABLE, hasta el momento solo se admiten las cláusulas ORDER BY, LIMIT y OFFSET. Esto significa que no podemos usar la cláusula WHERE con TABLE, al menos por ahora.

7 - Funciones de Ventana

Esta novedad nos ayuda a solucionar un problema muy común cuando trabajamos con agrupación de datos. Cuando estamos realizando algún tipo de agrupamiento en MySQL, con los comandos GROUP BY o ORDER BY, por ejemplo, por defecto disminuye el número de filas devueltas. Las funciones de ventana, que se introdujeron en la versión 8 de MySQL, nos ayudan a ver los resultados de manera más individual en cada fila de la tabla.

Para ver esto en la práctica, vamos a hacer un ejemplo. Vamos a crear una tabla de empleados, que contendrá el nombre, el salario y el departamento de cada empleado. El script de creación de la tabla es el siguiente:

CREATE TABLE employees (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`name` VARCHAR(64) NOT NULL,
	salary DECIMAL(10, 2) NOT NULL,
	department VARCHAR(256) NOT NULL,
	dtregister TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP()
);

Vamos a insertar algunos datos en esta tabla, usando este script:

INSERT INTO employees VALUES
	(NULL, 'Bill', 5000, 'Cursos Online', DEFAULT),
	(NULL, 'Mark', 5000, 'Marketing', DEFAULT),
	(NULL, 'John', 5000, 'Desarrollo', DEFAULT),
	(NULL, 'Leonard', 4000, 'Desarrollo', DEFAULT),
	(NULL, 'Luke', 3000, 'Marketing', DEFAULT),
	(NULL, 'Han', 2000, 'Marketing', DEFAULT),
	(NULL, 'Paul', 1000, 'Cursos Online', DEFAULT);

Veamos que tenemos 7 registros en nuestra tabla. Ahora vamos a realizar un SELECT que nos devolverá el salario total de los empleados, agrupados por departamento. Usaremos la siguiente consulta:

SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department;

Veremos el siguiente resultado:

Resultado del SELECT en nuestra Base de Datos

El salario total de cada departamento se ha devuelto a nosotros. Sin embargo, si deseamos ver también la información del salario individual de cada empleado, no podremos hacerlo usando la cláusula GROUP BY. Es en este momento cuando las funciones de ventana entran en escena y pueden ayudarnos.

Vamos a ejecutar esta consulta de nuevo, pero ahora utilizando la cláusula OVER y, en lugar de usar GROUP BY, vamos a definir ORDER BY. El script será así:

SELECT `name`, salary, department, SUM(salary) OVER(PARTITION BY department) AS total_salary FROM employees ORDER BY department;

Nota que también traeremos las informaciones del nombre y salario individual de cada empleado. El resultado será el siguiente:

Resultado de nuestra consulta en MySQL

El campo “total_salary” sigue trayendo la información del salario total de cada departamento. Sin embargo, ahora también podemos ver cuál es el salario de cada empleado de esos departamentos. Los datos están mucho más claros ahora, ¿no crees?

8 - Índices invisibles

Los índices se utilizan mucho para facilitar la localización de las columnas en nuestras tablas, lo que puede optimizar nuestras consultas.

A partir de la versión 8, MySQL permite crear índices invisibles. Son índices normales, pero no pueden ser vistos por el optimizador de MySQL. Es decir, el índice seguirá existiendo, pero no podrá ser usado en ninguna consulta.

¿Cómo puede ayudarnos esto? Pueden ser muy útiles cuando queremos realizar pruebas en nuestra base de datos. Por ejemplo: imagina que deseamos eliminar un índice, pero queremos probar si su ausencia causará algún efecto colateral en nuestra base de datos. En ese caso, podemos definir ese índice como invisible. Si ocurre algún problema, basta con hacer un “rollback”, por así decir, y definir el índice como visible de nuevo.

O imagina que deseamos agregar un índice a una tabla específica y queremos ver si ayudará o no en el rendimiento de las consultas. Podemos usar nuevamente el concepto de índices invisibles para eso.

Podemos crear un índice invisible de tres maneras: 1) al crear una tabla; 2) usando el script CREATE INDEX y 3) al modificar una tabla.

En los tres casos, solo necesitamos añadir la palabra INVISIBLE al índice. Ejemplo al crear una tabla:

CREATE TABLE users (
	username VARCHAR(256) NOT NULL
	INDEX username_idx (i) INVISIBLE
);

Ejemplo usando el comando CREATE INDEX:

CREATE INDEX username_idx ON users (username) INVISIBLE;

Ejemplo usando el comando ALTER TABLE:

ALTER TABLE users ADD INDEX username_idx (username) INVISIBLE;

Un índice invisible puede ser modificado a VISIBLE en cualquier momento. Otro detalle importante a recordar es que las claves primarias no pueden ser índices invisibles.

9 - Roles

La novedad de roles será muy útil para quienes gestionan el acceso a los recursos de la base de datos.

“Roles” significa “papeles”, o “funciones”. Este recurso facilita la definición de privilegios para los usuarios, ya que agrupa estos privilegios según las funciones que cada persona tendrá al acceder a la base.

Imagina que los empleados de nuestro equipo de desarrollo desempeñan tres funciones principales: 1) Administrador de la base de datos (DBA); 2) Diseñador de la base de datos y 3) Desarrollador web. Vamos a crear tres roles para estas funciones, con el siguiente script:

CREATE ROLE 'hcode_dba', 'hcode_dbdesigner', 'hcode_developer';

Ahora vamos a dar privilegios a estas funciones:

GRANT ALL ON hcode_cafe.* TO 'hcode_dba';
GRANT CREATE, DROP, ALTER ON hcode_cafe.* TO 'hcode_dbdesigner';
GRANT SELECT, INSERT, UPDATE, DELETE ON hcode_cafe.* TO 'hcode_developer';

Ten en cuenta que definimos los privilegios en las funciones desempeñadas por los empleados, no en los empleados en sí. Ahora vamos a crear los usuarios de nuestro equipo:

CREATE USER 'glaucio'@'localhost' IDENTIFIED BY 'glauciohcode';
CREATE USER 'djalma'@'localhost' IDENTIFIED BY 'djalmahcode';
CREATE USER 'joao'@'localhost' IDENTIFIED BY 'joaohcode';

Por último, vamos a relacionar nuestros usuarios con sus respectivas funciones, o papeles:

GRANT 'hcode_dba' TO 'glaucio'@'localhost';
GRANT 'hcode_developer' TO 'joao'@'localhost';
GRANT 'hcode_dbdesigner', 'hcode_developer' TO 'djalma'@'localhost';

Ten en cuenta que en la última línea hemos asignado más de una función al usuario ‘djalma’. Esto muestra una de las ventajas del recurso de roles: además de ayudarnos a organizar mejor los privilegios de los usuarios, nos permite realizar la distribución de estos privilegios de manera mucho más sencilla. Esta es una novedad que realmente vino a ayudarnos.

10 - Funciones de conteo de filas deprecadas

Hemos llegado a la última novedad de este artículo y vamos a hablar de una de las deprecaciones. Usar el modificador SQL_CALC_FOUND_ROWS y la función FOUND_ROWS() es una costumbre para muchos de nosotros, especialmente cuando estamos trabajando con paginación en nuestros sistemas.

Sin embargo, ya ha sido anunciado por el equipo de MySQL que estos dos recursos han sido descontinuados y serán eliminados en las próximas versiones de MySQL. Tal vez todavía funcione en tu MySQL, pero pronto eso ya no ocurrirá más.

Ahora hay una sintaxis más simple que ejecuta la misma función. Hablaremos sobre ella ahora. Imagina que deseamos seleccionar solo 15 registros de nuestra tabla de usuarios que tienen el campo de nombre como “Rafael” y luego deseamos devolver el número de registros encontrados. Antiguamente ejecutaríamos estos dos scripts:

SELECT SQL_CALC_FOUND_ROWS * FROM users WHERE username LIKE ‘%Rafael%’ LIMIT 15;
SELECT FOUND_ROWS();

Esta sintaxis está deprecada. La nueva sintaxis implica ejecutar la primera consulta normalmente, pero sin informar el modificador:

SELECT * FROM users WHERE username LIKE ‘%Rafael%’ LIMIT 15;

La segunda consulta implica ejecutar el SELECT de la función COUNT(*), sin informar el nombre de la tabla ni el LIMIT, pero con la cláusula WHERE explícita:

SELECT COUNT(*) WHERE username LIKE ‘%Rafael%’;

El resultado devuelto será el mismo.

Si deseas, podrás seguir la demostración de algunos de estos recursos en video en el Hcode Café #19, nuestro programa semanal de tecnología.

Estas son algunas de las novedades que llegaron con la versión 8 de MySQL. Sin embargo, esta versión sigue recibiendo actualizaciones y nuevos recursos cada año, y con seguridad continuaremos siguiendo el desarrollo de este increíble sistema de gestión de bases de datos.

Hasta el próximo artículo :)

Sigue aprendiendo con Hcode

Regístrate en la plataforma de cursos y sigue las próximas guías del blog.