A palestrante apresentou as principais novidades do MySQL 5.7 em 3 frases:
1) O MySQL 5.7 trouxe melhorias no suporte a operações DDL em tempo real, armazenamento de dados JSON, colunas geradas e o novo schema "sys" para monitoramento.
2) As colunas geradas permitem indexar valores calculados sem ocupar espaço em disco, enquanto colunas armazenadas indexam esses valores de forma armazenada.
3) O schema "sys" fornece visões para monitorar consultas caras, índices não utiliz
5. • In Place
(ALGORITHM=INPLACE)
• Renomear índices
• VARCHAR de 1b para 255b*
• Adicionar uma coluna virtual
• Table-copy
(ALGORITHM=COPY)
• VARCHAR de 256b para
65535b*
• Adicionar colunas
• Conversão de tipos
Online DDL
5
* Depende de encoding da tabela e coluna, para latin1
seriam 255 caracteres, para utf8 seriam até 63 caracteres
7. • Armazenamento é binário no banco de dados
• É possível converter campos TEXT se JSON_VALID() retorna
TRUE para toda a tabela
• Conversão de TEXT para JSON é uma operação COPY
• É impossível de se armazenar um JSON inválido
• Colunas do tipo JSON não podem ter um valor DEFAULT
• Índices são possíveis devido à Generated Columns
Recursos
7
8. Tabela `twitter_users`
8
Field Type Null Key Default Extra
id int(11) NO PRI auto_increment
id_str varchar(255) NO UNI
screen_name varchar(255) NO INDEX
response json YES
created_at datetime NO CURRENT_TIMESTAMP
updated_at datetime NO CURRENT_TIMESTAMP
on update
CURRENT_TIMESTAMP
CREATE TABLE `twitter_users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`id_str` VARCHAR(255) NOT NULL,
`screen_name` VARCHAR(255) NOT NULL,
`response` JSON NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `un_id_str` (`id_str`),
KEY `id_str` (`id_str`),
KEY `ix_screen_name` (`screen_name`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
18. • Não ocupa espaço em disco
• A criação é INPLACE
• O valor da coluna é gerado em tempo real
• Chamado quando uma trigger de evento BEFORE é chamada
Virtual Columns
18
19. • Ocupa espaço em disco
• Valor atualizado para cada operação de escrita (INSERT, UPDATE)
• Usa o algoritmo COPY para criação e remoção da coluna
Stored Columns
19
20. • Ambas podem ser indexadas
• Permitem que expressões como essas sejam usadas:
• Operadores ( +, -, *, /, etc)
• Funções nativas (LEFT(), SUBSTR(), JSON_EXTRACT(), etc)
• Literais (‘novo’, 2, etc)
• Subqueries não são suportadas
Virtual and Stored Columns
20
22. -- Total rows
SELECT COUNT(*) FROM `twitter_users`;
-- 8906 rows
-- Virtual Columns
ALTER TABLE `twitter_users`
ADD COLUMN `profile_image_url` VARCHAR(255)
GENERATED ALWAYS AS (response->>"$.profile_image_url");
-- [2016-10-04 14:16:24] completed in 46ms
-- Stored Columns
ALTER TABLE `twitter_users`
ADD COLUMN `location` VARCHAR(255)
GENERATED ALWAYS AS (response->>"$.location") STORED
ADD INDEX `ix_location` (`location`);
-- [2016-10-04 14:20:09] 8906 rows affected in 2s 689ms
23. Tabela `twitter_users`
23
Field Type Null Key Default Extra
id int(11) NO PRI auto_increment
id_str varchar(255) NO UNI
screen_name varchar(255) NO INDEX
response json YES
location varchar(255) YES INDEX STORED GENERATED
profile_image_url varchar(255) YES VIRTUAL GENERATED
created_at datetime NO CURRENT_TIMESTAMP
updated_at datetime NO CURRENT_TIMESTAMP
on update
CURRENT_TIMESTAMP
24. Busca
24
SELECT screen_name, location, profile_image_url FROM `twitter_users`
WHERE location LIKE "%Brasil%" LIMIT 5;
-- Results
-- +---------------+-----------------------+----------------------------+
-- | screen_name | location | profile_image_url |
-- +---------------+-----------------------+----------------------------+
-- | hussanii | Brasil | http://pbs.twimg.com/(...) |
-- | fplcampos | São Paulo, Brasil | http://pbs.twimg.com/(...) |
-- | ivanrosolen | Sampa - Brasil | http://pbs.twimg.com/(...) |
-- | rogeriopradoj | Brasil, São Paulo, SP | http://pbs.twimg.com/(...) |
-- | rafinhabastos | Brasil | http://pbs.twimg.com/(...) |
-- +---------------+-----------------------+----------------------------+
-- 5 rows in set (0.00 sec)
26. • Precisa ser instalado na versão 5.6
• Instalado por padrão no 5.7
• MySQL Workbench vem com um cliente
• Em produção é recomendado apenas estar ativado em casos
críticos
MySQL `sys` schema
26
27.
28.
29. SELECT * FROM
29
Description Table
*High Cost SQL statements sys.`x$statement_analysis`
*Top 5% slower queries sys.`x$statements_with_runtimes_in_95th_percentile`
Use temporary tables sys.`statements_with_temp_tables`
Unused Indexes sys.`schema_unused_indexes`
Full table scans sys.`schema_tables_with_full_table_scans`
*x$ é um prefixo para views criadas para um formato mais amigável ao usuário
32. • `sql_mode` agora é mais estrito e os seguintes modos vêm
habilitados por padrão:
• ONLY_FULL_GROUP_BY
• NO_ZERO_DATE
• NO_ZERO_IN_DATE
• ERROR_FOR_DIVISION_BY_ZERO
Demais Alterações
32
33. • Senhas agora podem ter uma data de expiração
• Tabelas agora suportam mais de uma trigger pro mesmo evento
• Alterações em YEAR(2):
• marcado como deprecated na 5.6
• removido na 5.7
33
Demais Alterações