简介html
MySQL 通过20来年发展示在已经是世界上最流行的开源数据库,8.0 版本做为5.7版本后的跨越大版本,除了大表秒级加列外还有其它什么特性了?能在生产上使用吗?MySQL5.7 怎么才能无损升级到MySQL8.0?mysql
起源于上个世纪末的MySQL每隔2~3年就会发布一次大版本,不断持续的“升级”。2008年MySQL被Sun公司以10亿美圆收购,2009年甲骨文以74亿美圆收购Sun公司,这是很成功的一次收购与被收购!13年和16年的MySQL5.六、MySQL5.7都是里程碑式的版本,有了不少质的飞跃;18年发布了酝酿3年的MySQL8.0,又带来了哪些新特性?sql
# 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倍json
文档存储无固定表结构动态schema是很受我们开发人员喜好的缓存
支持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安全
对每一个门店销售量最高的商品进行统计,每一个部门按业绩来排名网络
SQL执行时内部优化器忽略指定索引;验证删除索引后对查询性能影响多线程
Alter table t1 alter index idx_str invisible; Alter table t1 alter index idx_str visible;
索引按倒序存储,以前方式都是按顺序存储;使用到具备倒序、升序列的复合索引并发
select * from tx where c1=10 order by c2 desc,c4 asc;
Where条件中没法使用到索引成为传说!
select * from tx where year(date_)=2020;
须要加锁的记录若被其它线程占有锁,则跳过,而不是等待
select * from tx where c1=12 for update skip locked; Empty set (0.00 sec)
须要加锁的记录有锁则报错
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)场景如抢红包、秒杀等有益
官方版多租户资源隔离成为了可能,更好提高在不一样读写业务场景下的性能
之前版本MySQL数据字典存放在多个地方,一机器多实例时存在大量文件描述符性能消耗,8.0版本都存放在事务性InnoDB表,MySQL异常挂掉后也不会再出现表损坏状况;DDL操做失败也不会再留下占空间的“临时文件”
节点自动加入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> 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)
线上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/