Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL em 2018:o que há no 8.0 e outras observações


Com a maioria, se não todo o ano de 2018 para trás (dependendo de quando você está lendo este post), não há dúvida de que foi um ano fantástico para bancos de dados SQL de código aberto.

PostgreSQL 11 e MySQL 8 foram ambos lançados, fornecendo a ambas as comunidades muito sobre o que 'falar '. Verdade seja dita, ambos os fornecedores introduziram muitas mudanças e adições significativas em seus respectivos lançamentos e merecem seus elogios e elogios.

Eu normalmente faço guest post sobre o primeiro aqui no blog do Variousnines (muito obrigado a uma ótima organização!), mas também tenho interesse no segundo. Com muitos posts no meu próprio site (link na minha seção bio), principalmente visando o MySQL versão 5.7, ele (MySQL) está sempre nos meus periféricos.

Então, o que o MySQL 8 tem que a versão 5.7 não tem? Quais são as melhorias? Bem, há muitos. Na verdade, muitos para cobrir em apenas uma postagem no blog.

Recentemente, atualizei para a versão 8 em meu ambiente de aprendizado/desenvolvimento Linux atual, então pensei em tentar apontar alguns deles.

Não posso garantir uma discussão aprofundada sobre seu 'favorito ' Novas características). Por outro lado, visitarei aqueles que chamaram minha atenção por interesse pessoal ou por meio dos muitos posts fantásticos publicados ao longo do ano na versão 8.

MySQL está ficando cada vez melhor... Melhorias fantásticas na versão 8!

Funções


Com funções, os DBAs podem mitigar a redundância, onde muitos usuários compartilhariam o mesmo privilégio ou conjunto de privilégios.

As funções fazem parte do padrão SQL.

Depois de criar uma função específica com os privilégios desejados/necessários, você pode atribuir aos usuários essa função específica por meio do comando GRANT ou da mesma forma, 'retira ' com REVOKE.

As funções vêm com vários benefícios e, para facilitar um pouco a vida, há algumas tabelas para ajudá-lo a acompanhá-las:

  • mysql.role_edges - Aqui você encontra essas funções e os usuários a elas atribuídas.
    mysql> DESC mysql.role_edges;
    +-------------------+---------------+------+-----+---------+-------+
    | Field             | Type          | Null | Key | Default | Extra |
    +-------------------+---------------+------+-----+---------+-------+
    | FROM_HOST         | char(60)      | NO   | PRI |         |       |
    | FROM_USER         | char(32)      | NO   | PRI |         |       |
    | TO_HOST           | char(60)      | NO   | PRI |         |       |
    | TO_USER           | char(32)      | NO   | PRI |         |       |
    | WITH_ADMIN_OPTION | enum('N','Y') | NO   |     | N       |       |
    +-------------------+---------------+------+-----+---------+-------+
    5 rows in set (0.01 sec)

  • mysql.default_roles - Armazena quaisquer funções padrão e os usuários atribuídos.
    mysql> DESC mysql.default_roles;
    +-------------------+----------+------+-----+---------+-------+
    | Field             | Type     | Null | Key | Default | Extra |
    +-------------------+----------+------+-----+---------+-------+
    | HOST              | char(60) | NO   | PRI |         |       |
    | USER              | char(32) | NO   | PRI |         |       |
    | DEFAULT_ROLE_HOST | char(60) | NO   | PRI | %       |       |
    | DEFAULT_ROLE_USER | char(32) | NO   | PRI |         |       |
    +-------------------+----------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

A combinação de ambas as tabelas (não no sentido SQL JOIN) fornece essencialmente uma 'localização centralizada ' onde você pode:conhecer, monitorar e avaliar todos os seus relacionamentos e atribuições de privilégios de função de usuário implementados.

Provavelmente, o cenário de uso de função de exemplo mais simples seria:

Você tem vários usuários que precisam de 'acesso somente leitura ' em uma tabela específica, portanto, exigindo pelo menos o privilégio SELECT. Em vez de conceder (SELECT) individualmente a cada usuário, você pode estabelecer (criar) uma função com esse privilégio e atribuir essa função a esses usuários.

Mas, os papéis vêm com um pequeno 'pega '. Uma vez criado e atribuído a um usuário, o usuário receptor deve ter um conjunto de funções padrão ativo, durante a autenticação no login.

Ainda sobre o assunto de papéis e usuários, acho importante mencionar a mudança implementada no MySQL 8 referente ao componente validate_password, que é uma variante do plugin validate_password usado na versão 5.7 .

Este componente fornece várias 'categorias distintas ' de verificação de senha:baixa, média (padrão) e forte. Visite a documentação do componente validate_password para obter um resumo completo das especificidades de validação de cada nível.

NoSQL Misturando com SQL - O Armazenamento de Documentos


Ainda estou aprendendo sobre esse recurso, apesar de um interesse passageiro no MongoDB no início de 2016. Até o momento, meu interesse, estudo e aprendizado foram focados apenas em 'SQL'. No entanto, estou ciente (através de muita leitura na web) que muitos estão entusiasmados com esse tipo de estruturação (orientada a documentos) entrelaçada com 'SQL relacional' agora disponível no repositório de documentos do MySQL 8.

Abaixo estão muitos benefícios disponíveis ao usar o armazenamento de documentos. Certifique-se e mencione seus favoritos que eu posso ter perdido na seção de comentários:
  • O tipo de dados JSON tem suporte desde a versão 5.7.8 do MySQL, mas a versão 8 introduziu melhorias significativas para trabalhar com JSON. Novas funções específicas de JSON junto com 'shorthand ' operadores que podem ser usados ​​no lugar de várias chamadas de função - com resultados/saída iguais.
  • Talvez um dos principais benefícios seja você não precisar mais implementar e trabalhar com várias soluções de banco de dados, pois NoSQL, SQL ou uma combinação dos dois são compatíveis com o armazenamento de documentos.
  • Uma "DevAPI" fornece recursos de fluxo de trabalho contínuos em um contexto de dados NoSQL (coleções e documentos). (Visite a documentação oficial do guia do usuário DevAPI para obter mais informações).
  • Sessões de linha de comando poderosas usando Python, SQL ou Javascript como a linguagem 'shell'.
  • Compatível com ACID.
  • Explore e descubra rapidamente seus dados sem definir um esquema, como faria em um modelo relacional.

Expressões de tabela comuns (CTEs ou cláusula WITH)


O que mais você pode dizer sobre os CTEs? Essas coisas são um divisor de águas! Para começar, o que exatamente é uma expressão de tabela comum?

Da Wikipédia:

"Uma expressão de tabela comum, ou CTE, (em SQL) é um conjunto de resultados nomeado temporário, derivado de uma consulta simples e definido dentro do escopo de execução de uma instrução SELECT, INSERT, UPDATE ou DELETE."

Vou dar um exemplo simples, demonstrando CTE's. No entanto, seu poder total não é aproveitado nesta seção, pois há muitos exemplos de casos de uso mais complexos do que esses.

Eu tenho uma tabela de nomes simples com esta descrição e dados:
mysql> DESC name;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| f_name | varchar(20) | YES  |     | NULL    |       |
| l_name | varchar(20) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM name;
+--------+------------+
| f_name | l_name     |
+--------+------------+
| Jim    | Dandy      |
| Johhny | Applesauce |
| Ashley | Zerro      |
| Ashton | Zerra      |
| Ashmon | Zerro      |
+--------+------------+
5 rows in set (0.00 sec)

Vamos descobrir quantos sobrenomes começam com 'Z':
mysql> SELECT *
    -> FROM name
    -> WHERE l_name LIKE 'Z%';
+--------+--------+
| f_name | l_name |
+--------+--------+
| Ashley | Zerro  |
| Ashton | Zerra  |
| Ashmon | Zerro  |
+--------+--------+
3 rows in set (0.00 sec)

Bastante fácil.

No entanto, usando a cláusula WITH, você pode 'acessar ' esse mesmo conjunto de resultados de consulta (que pode ser considerado uma tabela derivada) e referenciá-lo posteriormente na mesma instrução - ou 'escopo ':
 WITH last_Z AS (
           SELECT *
           FROM name
           WHERE l_name LIKE 'Z%')
   SELECT * FROM last_Z;
+--------+--------+
| f_name | l_name |
+--------+--------+
| Ashley | Zerro  |
| Ashton | Zerra  |
| Ashmon | Zerro  |
+--------+--------+
3 rows in set (0.00 sec)

Basicamente, atribuo um nome à consulta, envolvendo-a entre parênteses. Depois é só selecionar os dados que eu quero do que agora é o last_Z CTE.

O last_Z CTE fornece um conjunto de resultados completo, para que você possa filtrá-lo ainda mais na mesma instrução:
WITH last_Z AS ( 
           SELECT *
           FROM name
           WHERE l_name LIKE 'Z%')
   SELECT f_name, l_name FROM last_Z WHERE l_name LIKE '%a';
+--------+--------+
| f_name | l_name |
+--------+--------+
| Ashton | Zerra  |
+--------+--------+
1 row in set (0.00 sec)

Alguns dos recursos mais poderosos são 'encadeamento ' vários CTE's juntos e fazendo referência a outros CTE's dentro dos CTE's.

Aqui está um exemplo para você ter uma ideia (embora não seja muito útil):
WITH last_Z AS ( 
           SELECT *
           FROM name
           WHERE l_name LIKE 'Z%'),
        best_friend AS (
           SELECT f_name, l_name
           FROM last_Z
           WHERE l_name LIKE '%a')
   SELECT * from best_friend;
+--------+--------+
| f_name | l_name |
+--------+--------+
| Ashton | Zerra  |
+--------+--------+
1 row in set (0.00 sec)

Na consulta acima, você pode ver onde eu separei o CTE last_Z do CTE best_friend com uma vírgula e, em seguida, envolvi essa consulta entre parênteses após a palavra-chave AS.

Observe que posso então me referir (e usar) o CTE last_Z para definir essencialmente o CTE best_friend.

Aqui estão algumas razões pelas quais os CTEs são uma melhoria tão significativa na versão 8:
  • Outros fornecedores de SQL deram suporte a CTEs (muitos desde versões anteriores em seus ecossistemas individuais) e agora o MySQL 8 fechou a lacuna nessa área.
  • Uma inclusão SQL padrão.
  • Em alguns casos (quando apropriado), os CTEs são uma opção melhor do que tabelas temporárias, visualizações, tabelas derivadas (ou visualizações em linha) e algumas subconsultas.
  • Os CTEs podem fornecer um 'on-the-fly ' conjunto de resultados de cálculos que você pode consultar.
  • Um CTE pode fazer referência a si mesmo - conhecido como CTE recursivo (não demonstrado aqui).
  • CTEs podem nomear e usar outros CTEs
ClusterControlSingle Console para toda a sua infraestrutura de banco de dados Descubra o que mais há de novo no ClusterControlInstale o ClusterControl GRATUITAMENTE

Funções da janela


Consultas analíticas agora são possíveis no MySQL 8. Como as funções do Windows não são meu forte, estou focado em um estudo mais aprofundado e melhor compreensão delas, como um todo, seguindo em frente. Estes próximos exemplos são principalmente elementares de acordo com meu entendimento. Sugestões, conselhos e melhores práticas são bem-vindos dos leitores.

Eu tenho essa VIEW que fornece um conjunto de resultados de dados de pipe fictício (algo que eu entendo um pouco):
mysql> SELECT * FROM pipe_vw;
+---------+-------------+-----------+-------+-------------+------------+----------------+
| pipe_id | pipe_name   | joint_num | heat  | pipe_length | has_degree | wall_thickness |
+---------+-------------+-----------+-------+-------------+------------+----------------+
|     181 | Joint-278   | 39393A    | 9111  |       17.40 |          1 |          0.393 |
|     182 | Joint-8819  | 19393Y    | 9011  |       16.60 |          0 |          0.427 |
|     183 | Joint-9844  | 39393V    | 8171  |       10.40 |          0 |          0.393 |
|     184 | Joint-2528  | 34493U    | 9100  |       11.50 |          1 |          0.427 |
|     185 | Joint-889   | 18393z    | 9159  |       13.00 |          0 |          0.893 |
|     186 | Joint-98434 | 19293Q    | 8174  |        9.13 |          0 |          0.893 |
|     187 | Joint-78344 | 17QTT     | 179   |       44.40 |          1 |          0.893 |
|     188 | Joint-171C  | 34493U    | 17122 |        9.45 |          1 |          0.893 |
|     189 | Joint-68444 | 17297Q    | 6114  |       11.34 |          0 |          0.893 |
|     190 | Joint-4841R | 19395Q    | 5144  |       25.55 |          0 |          0.115 |
|     191 | Joint-1224C | 34493U    | 8575B |       15.22 |          1 |          0.893 |
|     192 | Joint-2138  | 34493C    | 91    |       13.55 |          1 |          0.893 |
|     193 | Joint-122B  | 34493U    | 9100B |        7.78 |          1 |          0.893 |
+---------+-------------+-----------+-------+-------------+------------+----------------+
13 rows in set (0.00 sec)

Imagine, eu preciso dos registros de ativos de tubulação apresentados em algum tipo de classificação de linha, dependendo do comprimento de cada tubulação individual. (Por exemplo, o comprimento mais longo é 'rotulado' a posição número 1, o segundo comprimento mais longo é 'rotulado' a posição 2, etc...)

Com base na descrição da função de janela RANK() na documentação:

"Retorna a classificação da linha atual dentro de sua partição, com lacunas. Os pares são considerados empates e recebem a mesma classificação. Esta função não atribui classificações consecutivas a grupos de pares se existirem grupos de tamanho maior que um; o resultado são números de classificação não contíguos ."

Parece ser um bem adequado para este requisito.
mysql> SELECT pipe_name, pipe_length,
    -> RANK() OVER(ORDER BY pipe_length DESC) AS long_to_short
    -> FROM pipe_vw;
+-------------+-------------+---------------+
| pipe_name   | pipe_length | long_to_short |
+-------------+-------------+---------------+
| Joint-78344 |       44.40 |             1 |
| Joint-4841R |       25.55 |             2 |
| Joint-278   |       17.40 |             3 |
| Joint-8819  |       16.60 |             4 |
| Joint-1224C |       15.22 |             5 |
| Joint-2138  |       13.55 |             6 |
| Joint-889   |       13.00 |             7 |
| Joint-2528  |       11.50 |             8 |
| Joint-68444 |       11.34 |             9 |
| Joint-9844  |       10.40 |            10 |
| Joint-171C  |        9.45 |            11 |
| Joint-98434 |        9.13 |            12 |
| Joint-122B  |        7.78 |            13 |
+-------------+-------------+---------------+
13 rows in set (0.01 sec)

No próximo cenário, quero desenvolver ainda mais o exemplo anterior, classificando os registros de comprimentos mais longos para os mais curtos, mas por cada grupo individual dos valores distintos de espessura de parede.

Talvez a consulta e os resultados abaixo expliquem melhor onde minha prosa pode não ter:
mysql> SELECT pipe_name, pipe_length, wall_thickness,
    -> RANK() OVER(PARTITION BY wall_thickness ORDER BY pipe_length DESC) AS long_to_short
    -> FROM pipe_vw;
+-------------+-------------+----------------+---------------+
| pipe_name   | pipe_length | wall_thickness | long_to_short |
+-------------+-------------+----------------+---------------+
| Joint-4841R |       25.55 |          0.115 |             1 |
| Joint-278   |       17.40 |          0.393 |             1 |
| Joint-9844  |       10.40 |          0.393 |             2 |
| Joint-8819  |       16.60 |          0.427 |             1 |
| Joint-2528  |       11.50 |          0.427 |             2 |
| Joint-78344 |       44.40 |          0.893 |             1 |
| Joint-1224C |       15.22 |          0.893 |             2 |
| Joint-2138  |       13.55 |          0.893 |             3 |
| Joint-889   |       13.00 |          0.893 |             4 |
| Joint-68444 |       11.34 |          0.893 |             5 |
| Joint-171C  |        9.45 |          0.893 |             6 |
| Joint-98434 |        9.13 |          0.893 |             7 |
| Joint-122B  |        7.78 |          0.893 |             8 |
+-------------+-------------+----------------+---------------+
13 rows in set (0.00 sec)

Essa consulta usa a cláusula PARTITION BY na coluna wall_thickness porque queremos a classificação (que ORDER BY pipe_length DESC fornece), no entanto, precisamos dela no contexto dos grupos wall_thickness individuais.

Cada classificação de coluna long_to_short é redefinida para 1 conforme você encontra (ou altera) para um valor de coluna wall_thickness diferente.

Vamos nos concentrar nos resultados de um único grupo.

Direcionando os registros com valores de wall_thickness 0,893, a linha com pipe_length 44,40 tem um long_to_short 'ranking' correspondente de 1 (é o mais longo), enquanto a linha com pipe_length 7,78 tem um long_to_short 'ranking' correspondente de 8 (o mais curto) dentro desse grupo específico (0,893) de valores de espessura de parede.

As funções de janela são bastante poderosas e todo o seu escopo e amplitude não poderiam ser cobertos em uma única seção. Certifique-se de visitar as funções de janela suportadas na documentação do MySQL 8 para obter mais informações sobre as atualmente disponíveis.

Suporte e recursos espaciais aprimorados


Este é um tremendo conjunto de recursos incluídos no MySQL 8. O suporte das versões anteriores, ou a falta dele, simplesmente não pode ser comparado a outras implementações de fornecedores (pense no PostGIS para PostgreSQL).

Nos últimos 10 anos, trabalhei em campo como Pipeline Surveyor, coletando dados de GPS e ativos, então esse grupo de mudanças definitivamente chama minha atenção.

A especialização em dados espaciais é um assunto abrangente por si só e, com certeza, estou longe de ser um especialista nisso. No entanto, espero resumir as mudanças significativas entre as versões 5.7 e 8 e transmiti-las de maneira clara e concisa.

Vamos nos familiarizar com 2 termos-chave (e conceitos) para os propósitos desta seção.

  1. Sistema de Referência Espacial ou SRS - Aqui está uma definição parcial da Wikipedia:

    "Um sistema de referência espacial (SRS) ou sistema de referência de coordenadas (CRS) é um sistema local, regional ou global baseado em coordenadas usado para localizar entidades geográficas. Um sistema de referência espacial define uma projeção de mapa específica, bem como transformações entre diferentes referências espaciais. sistemas."

  2. Identificador do Sistema de Referência Espacial ou SRID - Além disso, a Wikipedia tem SRIDs definidos como tal:

    "Um Identificador de Sistema de Referência Espacial (SRID) é um valor exclusivo usado para identificar inequivocamente definições de sistema de coordenadas espaciais projetadas, não projetadas e locais. Esses sistemas de coordenadas formam o coração de todos os aplicativos GIS."

MySQL suporta muitos tipos de dados espaciais. Um dos mais comuns é um PONTO. Se você usar seu GPS para navegar até seu restaurante favorito, esse local será um PONTO no mapa.

O MySQL 5.7 trata praticamente todos os 'objetos espaciais ' como tendo um SRID de 0, o que é significativo para cálculos. Esses cálculos são computados em um tipo cartesiano de sistema de coordenadas. No entanto, todos sabemos que nosso globo é uma esfera e está longe de ser plano. Portanto, na versão 8, você pode considerá-lo como plano ou esférico nos cálculos.

De volta a esses dois termos, definimos anteriormente.

Mesmo que 0 seja o SRID padrão no MySQL versão 8, muitos (aproximadamente 5.000+) outros SRIDs são suportados.

Mas por que isso é importante?

Esta fantástica explicação através da postagem do blog, Sistemas de Referência Espacial no MySQL 8.0, resume bem:

"Por padrão, se não especificarmos um SRID, o MySQL criará geometrias no SRID 0. SRID 0 é a noção do MySQL de um plano Catesiano abstrato, sem unidades, infinito. Enquanto todos os outros SRSs se referem a alguma superfície e define unidades para o eixos, SRID 0 não."

Essencialmente, ao realizar cálculos com SRIDs diferentes de SRID 0 , então a forma da nossa Terra entra em jogo, é considerada e afeta esses cálculos. Isso é crucial para quaisquer cálculos significativos/precisos. Para um resumo aprofundado e uma melhor extrapolação, veja esta postagem de blog cobrindo geografia no MySQL 8.

Eu também recomendo a postagem do blog MySQL Server Team, Geographic Spatial Reference Systems in MySQL 8.0, para maior clareza sobre SRSs. Certifique-se e dê uma lida!

Por fim, para questões de atualização de dados espaciais da versão 5.7 para 8, visite algumas das alterações incompatíveis listadas aqui para obter mais informações.

Outras observações notáveis


Abaixo estão outros aprimoramentos de versão que devo reconhecer, embora não sejam abordados em profundidade nesta postagem do blog:
  • utf8mb4 agora é o conjunto de caracteres padrão (anteriormente latin1) - Melhor suporte para aqueles que devem ter emojis, além de alguns idiomas...
  • Dicionário de dados transacionais - os metadados do MySQL agora são armazenados em tabelas InnoDB.
  • Índices invisíveis - Defina a visibilidade de um índice para o otimizador, determinando, em última análise, se adicioná-lo ou removê-lo (o índice) é uma coisa boa ou ruim. Adicionar um índice a uma tabela grande existente pode ser 'caro ' em termos de bloqueio e recursos.
  • Índices decrescentes - melhor desempenho em valores indexados que são armazenados em ordem decrescente.
  • Instant Add Column - Para alterações de esquema, especifique ALGORITHM=INSTANT nas instruções ALTER TABLE e (se possível para a operação) evite bloqueios de metadados. (Para mais informações, veja este ótimo post do MySQL Server Team, e a seção ALTER TABLE dos documentos oficiais.)

Seção de bônus:algo que eu esperava ver...

Recursos relacionados Série de blogs ClusterControl for MySQL Torne-se um DBA MySQL - Operações comuns - Alterações na topologia de replicação Série de blogs Torne-se um DBA MySQL - Atualizações de banco de dados
As restrições de verificação ainda não chegaram ao produto MySQL.

Assim como nas versões anteriores do MySQL, a sintaxe de restrição de verificação é permitida em seus comandos CREATE TABLE, mas é ignorada. Que eu saiba, a maioria dos outros fornecedores de SQL oferece suporte a restrições de verificação. Venha participar da festa MySQL!

O MySQL 'intensificou significativamente ' sua oferta na versão 8. O suporte a recursos espaciais robustos, opções convenientes de funções de gerenciamento de usuários, soluções de dados SQL/NoSQL 'híbridas' e funções analíticas entre as inúmeras melhorias adicionais é realmente notável.

Na minha opinião, com a versão 8, o MySQL continua a fornecer uma opção sólida no crescente e competitivo ecossistema SQL de código aberto, repleto de soluções relevantes e ricas em recursos.

Obrigado por ler.