跨时代的MySQL8.0新特性解读

作者:jiaxin
出处:
简介
【跨时代的MySQL8.0新特性解读】MySQL 经过20来年发展现在已是世界上最流行的开源数据库 , 8.0 版本作为5.7版本后的跨越大版本 , 除了大表秒级加列外还有其它什么特性了?能在生产上使用吗?MySQL5.7 怎么才能无损升级到MySQL8.0?
MySQL发展历程
跨时代的MySQL8.0新特性解读文章插图
起源于上个世纪末的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.18mysql> alter table sbtest1 add str varchar(200) not null default 'mysql8.0 新加字段';Query OK, 0 rows affected (0.13 sec)Records: 0Duplicates: 0Warnings: 0# mysql5.7.16mysql>alter table sbtest1 add str varchar(200) not null default 'mysql5.7 新加字段';Query OK, 0 rows affected (6 min 8.36 sec)Records: 0Duplicates: 0Warnings: 0以前表加列操作需要重建表(消耗大量的IO资源和时间) , 8.0加列没有这个步骤 。 秒级加列(不要指定列位置 , 如after str1)让开发人员再也不用等到大半夜列加完后再上线了 , 也让我们dba不用老担心加列失败(生产环境出现加列报主键冲突错误)
性能提升
跨时代的MySQL8.0新特性解读文章插图
# mysql5.7.16mysql> select count(*) from sbtest1;+----------+| count(*) |+----------+| 29991137 |+----------+1 row in set (3 min 12.24 sec)# mysql8.0.18mysql> 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

跨时代的MySQL8.0新特性解读文章插图
文档存储无固定表结构动态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条件中无法使用到索引成为传说!