跨时代的MySQL8.0新特性解读
简介
MySQL 经过20来年发展现在已是世界上最流行的开源数据库,8.0 版本作为5.7版本后的跨越大版本,除了大表秒级加列外还有其它什么特性了?能在生产上使用吗?MySQL5.7 怎么才能无损升级到MySQL8.0?
MySQL发展历程

起源于上个世纪末的MySQL每隔2~3年就会发布一次大版本,不断持续的“升级”。2008年MySQL被Sun公司以10亿美元收购,2009年甲骨文以74亿美元收购Sun公司,这是很成功的一次收购与被收购!13年和16年的MySQL5.6、MySQL5.7都是里程碑式的版本,有了很多质的飞跃;18年发布了酝酿3年的MySQL8.0,又带来了哪些新特性?
MySQL8.0新特性
秒级加列
- 只改数据字典表元数据信息
- 5.7和8.0 sbteset1表数据分别为3000w
# mysql8.0.18
mysql> alter table sbtest1 add str varchar(200) not null default 'mysql8.0 新加字段';
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
# mysql5.7.16
mysql> alter table sbtest1 add str varchar(200) not null default 'mysql5.7 新加字段';
Query OK, 0 rows affected (6 min 8.36 sec)
Records: 0 Duplicates: 0 Warnings: 0
以前表加列操作需要重建表(消耗大量的IO资源和时间),8.0加列没有这个步骤。秒级加列(不要指定列位置,如after str1)让开发人员再也不用等到大半夜列加完后再上线了,也让我们dba不用老担心加列失败(生产环境出现加列报主键冲突错误)
性能提升

# mysql5.7.16
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 29991137 |
+----------+
1 row in set (3 min 12.24 sec)
# mysql8.0.18
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 30000000 |
+----------+
1 row in set (45.70 sec)
分别在只更新和只读场景下,8.0相比5.7在高并发时性能提升近1倍;求表总数据量8.0响应时间也将近提升5倍
文档数据库
- MySQL Document Store,NoSQL + SQL = MySQL
- 多文档事务,ACID特性
- 支持更新JSON中部分filed

文档存储无固定表结构动态schema是很受咱们开发人员喜爱的
SQL增强
共用表表达式(CTEs)
- 让SQL语句更加简单、直观
支持CTE的DB有 Teradata, DB2, Firebird, Microsoft SQL Server, Oracle ,PostgreSQL (since 8.4), MariaDB (since 10.2), SQLite (since 3.8.3), HyperSQL and H2 (experimental), MySQL8.0
- 窗口函数
对每个门店销售量最高的商品进行统计,每个部门按业绩来排名
- 共用表表达式(CTEs)和窗口函数是报表、OLAP业务一大利器
不可见索引(Invisible Indexes)
SQL执行时内部优化器忽略指定索引;验证删除索引后对查询性能影响
Alter table t1 alter index idx_str invisible;
Alter table t1 alter index idx_str visible;
降序索引(Descending Indexes)
索引按倒序存储,之前方式都是按顺序存储;使用到具有倒序、升序列的复合索引
select * from tx where c1=10 order by c2 desc,c4 asc;
函数索引 (Functional Indexes)
Where条件中无法使用到索引成为传说!
select * from tx where year(date_)=2020;
默认字符集为utf8mb4
- 更好的存储补充字符,如emojis表情符号
- 可变长度编码字符性能提升

一致性查询改进(Better Handling of Hot Rows)
- SKIP LOCKED
需要加锁的记录若被其它线程占有锁,则跳过,而不是等待
select * from tx where c1=12 for update skip locked;
Empty set (0.00 sec)
- NOWAIT
需要加锁的记录有锁则报错
select * from tx where c1=12 for update nowait;
ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.
SKIP LOCKED和NOWAIT对热行(Hot Rows)场景如抢红包、秒杀等有益
资源组(Resource Groups)
- 线程赋给不同的资源组
- 资源组和不同的内存、IO、CPU(现仅支持)进行关联

官方版多租户资源隔离成为了可能,更好提升在不同读写业务场景下的性能
新的数据字典
- 基于innodb的库表元数据信息
- 增强了MySQL crash-safe能力
- 原子DDL( Atomic DDLs )

以前版本MySQL数据字典存放在多个地方,一机器多实例时存在大量文件描述符性能消耗,8.0版本都存放在事务性InnoDB表,MySQL异常挂掉后也不会再出现表损坏情况;DDL操作失败也不会再留下占空间的“临时文件”
MGR增强
- 金融级别99.999%官方高可用方案
- MGR是业务多活(应用多活+数据库多活)的终极方案
- 多个MySQL组成一个group,数据写group
- 线上10套多主8.0 MGR集群
节点自动加入group次数 https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_autorejoin_tries
group剔除异常节点等待时间
https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_member_expel_timeout
节点自行脱离group等待时间
https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_unreachable_majority_timeout

线上8.0.18 MGR已稳定运行大半年,MGR的增强大大提升了在网络异常(机房级故障)下的健壮、稳定性;之前多次的机房故障演练8.0 MGR也都符合预期,网络恢复后MGR节点自动加入group 恢复读写
安全增强
SQL Roles SQL角色
Atomic ACL Statements 原子ACL语句
Dynamic Privileges 动态特权
Protection Against Brute Force Attacks 防止暴力攻击
REDO & UNDO Logs Encryption REDO & UNDO Logs加密
Caching sha2 authentication plugin 缓存Sa2认证插件
Password Rotation Policy 密码轮询策略
复制增强
Additional Metadata in the binary log binlog中额外的Metadata
Efficient JSON Replication 高效的json复制
Monitor Replication Lag with Microsecond Precision 监控复制延迟细到毫秒
More P_S Instrumentation for Group Replication 组复制更多的P_S
Enable binary log by default 默认启动了binlog
Improving the Parallel Applier with Writeset-based Dependency Tracking
基于Writeset-based Dependency Tracking的并行应用
Hostname support in Group Replication Whitelist 组复制白名单中支持主机名
实例克隆
- 传统方式,备份恢复再加入主从复制
- 源目标实例上安装克隆插件、授权、进行克隆
- 极大提高了MySQL的扩展性

全局变量持久化
- SYSTEM_VARIABLES_ADMIN (SET PERSIST)
- PERSIST_RO_VARIABLES_ADMIN (SET PERSIST_ONLY)
mysql> set persist_only innodb_buffer_pool_size=268435456*2;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> set persist innodb_buffer_pool_size=268435456*2;
Query OK, 0 rows affected (0.00 sec)
其它特性
- 优化器直方图
- 自增主键持久化
- 移除Query Cache
- GIS增强
- 备份锁
- group by 不再隐式排序
- redo_log优化、多线程并发写log buffer
MySQL5.7升级8.0

线上8.0.18 MGR大多是从5.7.22 MySQL原地升级;依次升级从库,online switch老主库至新从库(30s内完成),再升级老主库
展望未来

每个产品、版本都有一定生命周期,数据库也不列外,MySQL5.6 甲骨文官方支持到明年;也不是为了用新版本而“新版本”,主要是为了提升性能,享受开源带来的红利,更好地支持业务
MySQL 8.0 Release Notes
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/preface.html
Oracle Lifetime Support for MySQL
https://www.oracle.com/us/assets/lifetime-support-technology-069183.pdf
MySQL8.0 Benchmarks https://www.mysql.com/why-mysql/benchmarks/
图解MySQL | MySQL 为表添加列 是怎么"立刻"完成的
跨时代的MySQL8.0新特性解读的更多相关文章
- 深入解读MySQL8.0 新特性 :Crash Safe DDL
前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...
- MySQL-08 MySQL8.0新特性
性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...
- MySQL8.0新特性实验1
Server层,选项持久化 mysql> show variables like '%max_connections%';+------------------------+-------+| ...
- mysql8.0 新特性,对json类型的常用操作
mysql8 新特性-json数据类型操作 -- 根据key(可多个)获取value SELECT JSON_EXTRACT('{"id": 14, "name" ...
- Mysql8.0新特性【详细版本】
1. 账户与安全 用户创建与授权 之前:创建用户并授权 1 grant all privileges on *.* to 'myuser'@'%' identified by '3edc#EDC'; ...
- MySQL8.0 新特性 Hash Join
概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...
- 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...
- MySQL8.0新特性——支持原子DDL语句
MySQL 8.0开始支持原子数据定义语言(DDL)语句.此功能称为原子DDL.原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中.即使服务器在操作期间暂 ...
- MySQL8.0新特性总览
1.消除了buffer pool mutex (Percona的贡献) 2.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe.metadata管理更完善(可以利用ibd2s ...
随机推荐
- JVM学习第一天(虚拟机的前世今生与与Java的内存区域)
其实说JVM的时候有很多人会懵, 也很不理解,我会写Java代码就可以了,我干嘛要学这个,其实不是的,学习JVM是很有必要性的; 为什么要了解JVM 1:写出更好,更健壮的Java程序; 2:提高Ja ...
- 分布式事务框架.NetCore CAP总结
来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...
- boostrap栅格系统自适应的布局
1.栅格系统 Bootstrap是基于移动优先的原则开发的,使用了一系列的媒体查询(media queries)方法,为我们的布局和界面创建自适应的的分界点.这些分界点主要是基于视口宽度的最小值, ...
- TKE基于弹性网卡直连Pod的网络负载均衡
前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...
- 小BUG大原理 | 第一篇:重写WebMvcConfigurationSupport后SpringBoot自动配置失效
一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小BUG我了解到不少未知的 ...
- 离线安装Superset 0.37
上文提到了Superset 0.37的在线安装方式,只需要更新pip,然后pip install就可以了.但是在生产环境中,特别是内网环境中,很多时候是没有外网的,这时候就需要采取离线安装的方式. 本 ...
- .net MVC4.0项目发布到阿里云虚拟主机中遇到的问题。
正所谓学以致用,今天本来想做个bootstrap的demo发到服务器上看一下效果,结果服务器搞了半天,最终太晚了没能学到什么东西. 首先写好页面之后我做了一个MVC4.0的网站项目,然后把Bootst ...
- js中的选择排序和冒泡排序
var arr = [12,25,8,16,14]; console.log("排序前数组,",arr) //选择排序:第一轮,找出数组中最小的数,将第一项和最小的数互换位置.第二 ...
- xml的复习
xml的复习 1.概念:可扩展标记语言 2.功能: *存储数据 1.配置文件 2.在网络中传播 3.xml与html区别: xml语法严格,HTML语法松散 xml存储数据,HTML展示 ...
- python文档翻译之概述
Python是一个使用方便且功能强大的变成语言.它具有高效的高级数据结构和面向对象编程特性.其优雅的语法.动态类型.解释型特性使得它成为大多数平台上脚本和快速应用程序开发的理想语言. Python解释 ...