MySQL 8.0 - Conheça os Principais Recursos desta Nova Versão

27 de julho de 2022
Ronaldo B.

O MySQL é um dos Bancos de Dados mais populares do mundo. Completamente open-source, ele é muito usado no Desenvolvimento Web, devido à simplicidade de sua conexão com as linguagens de programação mais usadas no Mercado. Neste artigo veremos as principais novidades da versão 8 desse Banco de Dados, lançada em 2018.

1 - Performance

Uma das grandes novidades da versão 8 do MySQL com certeza é a sua performance. Estima-se que essa versão é até 2x mais rápida do que a versão 5.7 e consegue alcançar a impressionante marca de até 1,8 milhão de consultas por segundo. Um número muito expressivo, não concorda?

2 - OpenSSL

Segurança é um tema muito importante quando há o lançamento de novas versões de qualquer programa. Com o MySQL não é diferente. A versão 8 implementou o OpenSSL como a biblioteca padrão para seus protocolos TLS / SSL. Isso significa que essa versão é ainda mais segura, visto que o OpenSSL é uma biblioteca usada amplamente e muito confiável para proteger o acesso ao Banco de Dados.

3 - UTF-8

Um dos grandes problemas que sempre tivemos ao trabalhar com versões mais antigas do MySQL era a questão da encodação e a acentuação das palavras. Contudo, com o lançamento da versão 8, a equipe do MySQL deu um grande passo para nos ajudar a resolver esse problema. Agora, todas as tabelas terão a encodação utf8mb4 definida como padrão.

Isso irá facilitar bastante a comunicação do MySQL com linguagens de programação, como o PHP, sem que precisemos nos preocupar em definir o UTF-8 em seus dados.

4 - InnoDB

Outro problema que nos dava muita dor de cabeça e agora podemos nos despedir com o  lançamento da versão 8 é a questão dos erros nas transações no MySQL. Para que elas funcionem bem, precisamos definir a engine das tabelas como InnoDB. Nas versões anteriores do MySQL, precisávamos realizar essa definição em todas as tabelas ao criá-las; e se esquecêssemos de alguma tabela, as transações não funcionariam.

Mas, a partir da versão 8, essa engine é a padrão em todas as tabelas, o que é uma excelente notícia.

Nós falamos com mais detalhes sobre transações no MySQL 8 em nosso canal no YouTube.

5 - JSON

JSON se tornou nos últimos anos uma maneira quase que universal de realizar a troca de dados e informações entre servidores, sendo um bom sucessor do XML. E agora, essa notação de objetos em JavaScript também está presente no MySQL, como um novo tipo de dado introduzido na versão 8. Isso abre para nós um leque de possibilidades relacionadas a como armazenar múltiplas informações em uma única coluna em nosso Banco de Dados.

Para ver como ele funciona, o que acha de um pequeno exemplo?

Vamos criar uma tabela de usuários que irá conter o nome e as fotos do usuário.

Iremos usar o seguinte 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()
);

Perceba que a coluna “photos” é do tipo JSON. Vamos realizar a inserção de uma linha a essa tabela, com o seguinte script:

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

Esses dados serão inseridos em nossa tabela, incluindo o JSON com as fotos do usuário. Tendo em vista esse cenário, poderíamos conectar essa tabela com uma linguagem de programação e transformar o JSON de fotos em um array, o que facilitaria bastante exibi-las para nosso usuário.

O mais interessante do tipo de dado JSON é que ele realiza a validação da string que está sendo informada no momento da inserção. Se o JSON estiver em um formato inválido, um erro será retornado.

Neste artigo usamos o exemplo de um JSON de fotos, mas esse novo recurso poderá nos ajudar em muitas outras situações.

6 - “SELECT reduzido”

O comando SELECT é um dos mais utilizados quando estamos trabalhando no MySQL. Inclusive, na versão 8 foi introduzido um novo recurso que nos permite executar esse comando com um script menor.

Agora, se possuímos um comando SELECT * FROM, podemos substituí-lo por TABLE simplesmente. Note que estamos falando apenas do SELECT de todas as colunas da tabela.

Vamos usar a tabela que criamos acima como exemplo. Em vez de executar SELECT * FROM users, podemos usar o script TABLE users. Bem mais sucinto, não é mesmo?

Contudo, quando falamos de cláusulas com o comando TABLE, até o momento apenas as cláusulas ORDER BY, LIMIT e OFFSET são suportadas. Isso significa que não podemos usar a cláusula WHERE com o TABLE, pelo menos por enquanto.

7 - Funções de Janela

Essa novidade nos ajuda a solucionar um problema muito comum quando trabalhamos com agrupamento de dados. Quando estamos realizando algum tipo de agrupamento no MySQL, com os comandos GROUP BY ou ORDER BY, por exemplo, ele por padrão diminui o número de linhas retornadas. As funções de janela, que foram introduzidas na versão 8 do MySQL, nos ajudam a ver os resultados de maneira mais individual em cada linha da tabela.

Para ver isso na prática, vamos fazer um exemplo. Vamos criar uma tabela de funcionários, que conterá o nome, o salário e o departamento de cada funcionário. O script de criação da tabela é o seguinte:

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 inserir alguns dados a essa tabela, usando este script:

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

Veja que possuímos 7 registros em nossa tabela. Vamos realizar agora um SELECT que irá nos retornar o salário total dos funcionários, agrupados pelo departamento. Iremos usar a seguinte query:

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

Veremos o seguinte resultado:

Resultado do SELECT em nosso Banco de Dados

O salário total de cada departamento foi retornado para nós. Contudo, se desejarmos ver também a informação do salário individual de cada funcionário, não conseguiremos usando a cláusula GROUP BY. É nesse momento que as funções de janela entram em cena e podem nos ajudar.

Vamos executar essa query novamente, mas agora utilizando a cláusula OVER e, em vez de usar o GROUP BY, vamos definir o ORDER BY. O script ficará assim:

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

Note que também vamos trazer as informações do nome e salário individual de cada funcionário. O resultado será o seguinte:

Resultado de nossa consulta no MySQL

O campo “total_salary” continua trazendo a informação do salário total de cada departamento. Entretanto, agora podemos ver também qual é o salário de cada funcionário desses departamentos. Os dados estão bem mais claros agora, não acha?

8 - Índices invisíveis

Índices são muito usados para facilitar a localização das colunas em nossas tabelas, o que pode otimizar nossas consultas.

A partir da versão 8, o MySQL permite que criemos índices invisíveis. Eles são índices normais, mas não podem ser enxergados pelo otimizador do MySQL. Ou seja, o índice continuará a existir, mas não poderá ser usado em nenhuma consulta.

Como isso pode nos ajudar? Eles podem ser muito úteis quando queremos realizar testes em nosso Banco de Dados. Por exemplo: imagine que desejamos excluir um índice, mas queremos testar se sua ausência causará algum efeito colateral em nosso Banco. Nesse caso, podemos definir esse índice como invisível. Se ocorrer algum problema, basta dar um “rollback”, por assim dizer, e definir o índice como visível de novo.

Ou imagine que desejamos adicionar um índice a uma tabela específica e queremos ver se ele ajudará ou não na performance das consultas dela. Podemos usar novamente o conceito de índices invisíveis para isso.

Podemos criar um índice invisível de três maneiras: 1) ao criar uma tabela; 2) usando o script CREATE INDEX e 3) ao alterar uma tabela.

Nos três casos, precisamos apenas adicionar a palavra INVISIBLE ao índice. Exemplo ao criar uma tabela:

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

Exemplo usando o comando CREATE INDEX:

CREATE INDEX username_idx ON users (username) INVISIBLE;

Exemplo usando o comando ALTER TABLE:

ALTER TABLE users ADD INDEX username_idx (username) INVISIBLE;

Um índice invisível pode ser alterado para VISIBLE a qualquer momento. Um outro detalhe importante a lembrar é que chaves primárias não podem ser índices invisíveis.

9 - Roles

A novidade de roles será muito útil para quem gerencia o acesso aos recursos do Banco de Dados.

“Roles” significa “papéis”, ou “funções”. Esse recurso facilita a definição de privilégios para os usuários, pois ele agrupa esses privilégios pelas funções que cada pessoa terá ao acessar ao Banco.

Imagine que os funcionários de nossa Equipe de Desenvolvimento desempenham três funções principais: 1) Gerenciador do Banco de Dados (DBA); 2) Designer do Banco de Dados e 3) Desenvolvedor Web. Vamos criar três roles para essas funções, com o seguinte script:

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

Vamos agora dar privilégios para essas funções:

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';

Note que definimos os privilégios nas funções desempenhadas pelos funcionários, não nos funcionários em si. Vamos agora criar os usuários de nossa Equipe:

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

Por fim, vamos relacionar nossos usuários com suas respectivas funções, ou papéis:

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

Note que na última linha nós atribuímos mais de uma função para o usuário ‘djalma’. Isso mostra uma das vantagens do recurso de roles: além de nos ajudar a organizar melhor os privilégios dos usuários, nos permite realizar a distribuição desses privilégios muito mais facilmente. Essa é uma novidade que veio para realmente nos auxiliar.

10 - Funções de contagem de linhas depreciadas

Chegamos à última novidade deste artigo e vamos falar de uma depreciação. Usar o modificador SQL_CALC_FOUND_ROWS e a função FOUND_ROWS() é um costume para muitos de nós, principalmente quando estamos trabalhando com paginação em nossos sistemas.

Contudo, já foi anunciado pela Equipe do MySQL que esses dois recursos foram descontinuados e serão removidos nas próximas versões do MySQL. Talvez ele ainda esteja funcionando em seu MySQL, mas em breve isso não ocorrerá mais.

Há agora uma sintaxe mais simples que executa essa mesma função. Iremos falar sobre ela agora. Imagine que desejamos selecionar apenas 15 registros de nossa tabela de usuários que possuem o campo de nome como “Rafael” e depois desejamos retornar o número de registros encontrados. Antigamente executaríamos esses dois scripts:

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

Essa sintaxe está depreciada. A nova sintaxe envolve executar a primeira query normalmente, mas sem informar o modificador:

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

A segunda query envolve executar o SELECT da função COUNT(*), sem informar o nome da tabela nem o LIMIT, mas com a cláusula WHERE explícita:

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

O resultado retornado será o mesmo.

Se desejar, poderá acompanhar a demonstração de alguns desses recursos em vídeo no Hcode Café #19, nosso programa semanal de tecnologia.

Essas são algumas das novidades que chegaram com a versão 8 do MySQL. Entretanto, essa versão continua recebendo atualizações e novos recursos todos os anos, e com certeza iremos continuar a acompanhar o desenvolvimento desse incrível sistema de gerenciamento de Banco de Dados.

Até o próximo artigo :)

Hcode: Utilizamos cookies para a personalização de anúncios e experiências de navegação dentro de nosso site. Ao continuar navegando, você concorda com as nossas Política de Privacidade.