一、功能增强
1.1-所有系统表更换为InnoDB引擎
1.2-DDL原子化
InnoDB表的DDL支持事务完整性,要么成功要么回滚,将DDL操作回滚日志写入到data dictionary 数据字典表 mysql.innodb_ddl_log 中用于回滚操作,该表是隐藏的表,通过show tables无法看到。通过设置参数,可将ddl操作日志打印输出到mysql错误日志中。
mysql> set global log_error_verbosity=3;
mysql> set global innodb_print_ddl_logs=1;
1.3-DDL秒加列
只有在 MySQL 8.0.12 以上的版本才支持
mysql> show create table sbtest1;
CREATE TABLE `sbtest1` (
`id` int NOT NULL AUTO_INCREMENT,
`k` int NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
`d` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> alter table sbtest1 drop column d ;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> insert into sbtest1(k,c,pad) select k,c,pad from sbtest1;
Query OK, 1000000 rows affected (19.61 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
mysql> insert into sbtest1(k,c,pad) select k,c,pad from sbtest1;
Query OK, 2000000 rows affected (38.25 sec)
Records: 2000000 Duplicates: 0 Warnings: 0
mysql> insert into sbtest1(k,c,pad) select k,c,pad from sbtest1;
Query OK, 4000000 rows affected (1 min 14.51 sec)
Records: 4000000 Duplicates: 0 Warnings: 0
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 8000000 |
+----------+
1 row in set (0.31 sec)
mysql> alter table sbtest1 add column d int not null default 0;
Query OK, 0 rows affected (1.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table sbtest1 add column e int not null default 0;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
1.4-公用表表达式(CTE:Common Table Expression)
1.4.1-CTE优势
查询语句的可读性更好
在一个查询中,可以被引用多次
能够链接多个CTE
能够创建递归查询
能够提高SQL执行性能
能够有效地替代视图
1.5-默认字符集由latin1变为utf8mb4
1.6-Clone插件
1.7-资源组
1.8-角色管理
角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。
# 创建角色
mysql>create role role_test;
QueryOK, 0rows affected (0.03sec)
# 给角色授予权限
mysql>grant select on db.*to 'role_test';
QueryOK, 0rows affected (0.10sec)
# 创建用户
mysql>create user 'read_user'@'%'identified by '123456';
QueryOK, 0rows affected (0.09sec)
# 给用户赋予角色
mysql>grant 'role_test'to 'read_user'@'%';
QueryOK, 0rows affected (0.02sec)
# 给角色role_test增加insert权限
mysql>grant insert on db.*to 'role_test';
QueryOK, 0rows affected (0.08sec)
# 给角色role_test删除insert权限
mysql>revoke insert on db.*from 'role_test';
QueryOK, 0rows affected (0.10sec)
# 查看默认角色信息
mysql>select * from mysql.default_roles;
# 查看角色与用户关系
mysql>select * from mysql.role_edges;
# 删除角色
mysql>drop role role_test;
1.9-多值索引
1.10-函数索引
其实MySQL5.7中推出了虚拟列的功能,而MySQL8.0的函数索引也是依据虚拟列来实现的。
只 有那些能够用于计算列的函数才能 够用于创建函数索引。 函数 索引中不允许使用子 查询、参数、变量、存储函数以及自定义函数。 -
S PATIAL 索引和 FULLTEXT 索引不支持函数索引。
1.11-不可见索引
从MySQL 8.x开始支持隐藏索引(invisible indexes),只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引), 确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除 。
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int DEFAULT NULL,
`c2` int DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY `idx_c1` (`c1`) /*!80000 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
# 不可见的情况下是不会走索引的,key=null
mysql> explain select * from t1 where c1=3;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 20.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
# 设置为索引可见,
mysql> alter table t1 alter index idx_c1 visible;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int DEFAULT NULL,
`c2` int DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY `idx_c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
# 可以走索引,key=idx_c1
mysql> explain select * from t1 where c1=3;
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
| 1 | SIMPLE | t1 | NULL | ref | idx_c1 | idx_c1 | 5 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
1.12-新增降序索引
1.13-SET_VAR 语法
在sql语法中增加SET_VAR语法,动态调整部分参数,有利于提升语句性能。
select /*+ SET_VAR(sort_buffer_size = 16M) */ id from test order id ;
insert /*+ SET_VAR(foreign_key_checks=OFF) */ into test(name) values(1);
1.14-参数修改持久化
例如执行:
set PERSIST expire_logs_days=10 ;
1.15-innodb select for update跳过锁等待
1.16-group by 不再隐式排序
mysql 5.7
mysql> select count(*),age from t5 group by age;
+----------+------+
| count(*) | age |
+----------+------+
| 1 | 25 |
| 1 | 29 |
| 1 | 32 |
| 1 | 33 |
| 1 | 35 |
+----------+------+
5 rows in set (0.00 sec)
mysql 8.0
mysql> select count(*),age from t5 group by age;
+----------+------+
| count(*) | age |
+----------+------+
| 1 | 25 |
| 1 | 32 |
| 1 | 35 |
| 1 | 29 |
| 1 | 33 |
+----------+------+
5 rows in set (0.00 sec)
1.17-自增变量持久化
MySQL server重启后不再取消AUTO_INCREMENT = N表选项的效果。如果将自增计数器初始化为特定值,或者将自动递增计数器值更改为更大的值,新的值被持久化,即使服务器重启。 在回滚操作之后立即重启服务器将不再导致重新使用分配给回滚事务的自动递增值。 如果将AUTO_INCREMEN列值修改为大于当前最大自增值(例如,在更新操作中)的值,则新值将被持久化,随后的插入操作将从新的、更大的值开始分配自动增量值。
-- 确认下自己的版本
select VERSION()
/*
VERSION() |
----------+
5.7.26-log|
*/
-- 创建表
create table testincr(
id int auto_increment primary key,
name varchar(50)
)
-- 插入数据
insert into testincr(name) values
('刘备'),
('关羽'),
('张飞');
-- 查看当前的自增量
select t.`AUTO_INCREMENT` from information_schema.TABLES t where TABLE_NAME ='testincr'
/*
AUTO_INCREMENT|
--------------+
4|
*/
-- 更改列值
update testincr set id=4 where id=3
-- 查看现在的表值
/*
id|name|
--+----+
1|刘备 |
2|关羽 |
4|张飞 |
*/
-- 插入新值 问题出现
insert into testincr(name) values('赵云');
/*
SQL 错误 [1062] [23000]: Duplicate entry '4' for key 'PRIMARY'
*/
-- 如果我们再次插入,它就是正常的,因为id到5了。。。
mysql> insert into testincr(name) values('赵云');
Query OK, 1 row affected (0.01 sec)
1.18-binlog日志事务压缩
1.19-分区表改进
1.20-自动参数设置
将innodb_dedicated_server开启的时候,它可以自动的调整下面这四个参数的值:
innodb_buffer_pool_size 总内存大小
innodb_log_file_size redo文件大小
innodb_log_files_in_group redo文件数量
innodb_flush_method 数据刷新方法
(1). innodb_buffer_pool_size自动调整规则:
专用服务器内存大小 | buffer_pool_size大小 |
---|---|
小于1G | 128MB (MySQL缺省值) |
1G to 4G | OS内存*0.5 |
大于4G | OS内存*0.75 |
buffer_pool_size大小 | log_file_size 大小 |
---|---|
小于8G | 512MB |
8G to 128G | 1024MB |
大于128G | 2048MB |
buffer_pool_size大小 | log file数量 |
---|---|
小于8G | ROUND(buffer pool size) |
8G to 128G | ROUND(buffer pool size * 0.75) |
大于128G | 64 |
1.20.1-自适应参数的好处:
自动调整,简单方便,让DBA更省心 自带优化光环:没有该参数前,innodb_buffer_pool_size和log_file_size默认安装初始化后只有128M和48M,这对于一个生产环境来说是远远不够的,通常DBA都会手工根据服务器的硬件配置来调整优化,该参数出现后基本上可以解决入门人员安装MySQL后的性能问题。 云厂商,虚拟化等动态资源扩容或者缩容后,不必再操心MySQL参数配置问题。
1.20.2-自适应参数的限制:
专门给MySQL独立使用的服务器 单机多实例的情况不适用 服务器上还跑着其他软件或应用的情况不适用
1.21-窗口函数
它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种聚合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。
窗口函数内容太多,后期我会专门写一篇文章介绍窗口函数
1.22-索引损坏标记
1.23-InnoDB memcached插件
1.24-Online DDL
添加列。此功能也称为“即时添加列”。限制适用。 添加或删除虚拟列。 添加或删除列默认值。 修改 ENUM 或 SET 列的定义。 更改索引类型。 重命名表。
1.25-EXPLAIN ANALYZE
1.26-ReplicaSet
ReplicaSet 所有的节点必须基于GTID,并且数据复制采用异步的方式。使用复制集还可以接管既有的主从复制,但是需要注意,一旦被接管,只能通过AdminAPI对其进行管理。
1.27-备份锁
1.28-Binlog增强
本文关键字:#MySQL 8.0# #新特性解读#