MySQL的未来在哪?

Wesley13
• 阅读 848

摘要: 阿里云 MySQL&MariaDB 数据库产品结合开源社区,提供了稳定、可靠、便捷、弹性的在线数据库服务,帮助全球企业客户进行数字化转型。MySQL发展经历了一系列变化,从Sun到Oracle,发展也经过了几个阶段。

阿里云 MySQL&MariaDB 数据库产品结合开源社区,提供了稳定、可靠、便捷、弹性的在线数据库服务,帮助全球企业客户进行数字化转型。MySQL发展经历了一系列变化,从Sun到Oracle,发展也经过了几个阶段。MySQL从5.7版本开始走上了代码重构之路,这为MySQL未来10年的发展奠定了坚实基础,而未来MySQL将和云计算碰撞出什么样的火花?本文中,阿里云研究员吕漫漪将为大家分享MySQL的前世今生。

MySQL的未来在哪?

MySQL的过去

对于MySQL而言,其最大的发展变化就是被Sun收购,但是Sun原本就有数据库团队,MySQL被收购之后两个团队也合并了起来。MySQL的团队懂得社区并且有激情,而Sun的团队懂得怎样软件工程化,懂得保证质量和产品迭代,因此团队合并之后对于MySQL的改变很大。在这之后Sun被Oracle收购,这又是另外一个转折点,Oracle不仅给了MySQL团队很大自由,也投入了很多人力和物力。这也保证了2013、2015以及2018年,每间隔2年多的时间就能推出一个较为成熟的新版本,而在2018年之后其迭代周期就会迅速变短,因为朝着物联网方向发展,大概每三个月就会迭代一次。

近十年中,Oracle做了很多很好的事情,其中有一点事情虽然很少谈到,但是对于之后的发展却极为重要,那就是——代码重构。大家都希望完善功能,提高性能,但是很少有人做了代码重构。所谓代码重构就是在不改变功能的前提下,改善代码结构,提高可读性和可扩展性。这件事情虽然说起来简单,但是做起来难,特别是在进行决策的时候。MySQL5.6版本的时候决定进行代码重构,这是因为,Oracle增加了很多人力进入MySQL项目,但是当时的系统却存在很多Bug,这使得代码维护变得极为困难,使很多人力用于维护旧代码而不是增加新功能。此外,还使新功能的开发周期变得特别长,并且容易发生错误。当然,因为有很多错误,并且代码没有注释和文档,使新人接手项目变得困难。

MySQL的现状

因此为了保证长期的市场领先地位,MySQL必须要进行代码重构。在最开始,主要是将解析、优化、查询等步骤进行拆分,方便找到存在问题的模块。此外, 还实现了一些工具,来帮助检测Bug。MySQL5.7中的优化器部分,30%的代码是重写的,而在8.0中解析器的50%都是重写的,可见投入很大。MySQL将编程语言都统一到C++,编译器都使用最新版本,代码规格采用谷歌的,统一了300人的开发团队的代码标准。代码重构这件事情可能是对于未来10年的MySQL发展所做的最重要的一件事情。这是因为有了高质量的代码,才能够快速推出新的功能,降低维护成本,使得新人更快上手项目。

解析器在重构之前的结构就像是一盘意大利面,非常混乱,重构之后就变得极为清晰。当重构完解析器之后发现,以前很多解析器的Bug都消失了,此外,增加复杂语法的效率也得到了极大的提升,节约了大量时间。此外,还做了多核性能提高,这也是硬件的趋势,虽然每个内核不会更快,但是数目却会增加。在重构之后,读性能提高了三倍,写的性能也有很可观的的提高。

MySQL另外一个大的改变就是测试方面,如今的用户更多的是企业级用户,他们更多关注于更高的稳定性。对于数据库而言,最重要的永远都是稳定性,功能和性能是其次的。对于测试方法而言,要求对于新的功能,测试代码覆盖率达到95%,所有的开发人员在提交代码的时候都要进行单元测试。在实现新功能的时候,需要开发和测试同时进行,整体测试之后才能将代码推入主干,性能测试,每天都会测试,此外有重大更新推入主干时需要进行完整的性能测试,保证性能不会退化。所有测试都自动化,不需要人为测试。

功能上的最大亮点就是在MySQL5.7版本中推出了JSON数据类型。虽然MySQL一直都是关系型数据库,但是发现自己的用户不仅仅需要关系型数据库,也需要支持非结构化数据。因此MySQL需要和客户自己成长,因此在5.7版本中加入了JSON数据类型,也推出了很多适于JSON的函数,因此用户可以选择使用类似于MongoDB的Document的API,用户可以将MySQL当做NoSQL来使用,而不用关心底层的原理,而且还实现了NoSQL所无法比拟的功能。

MySQL5.7功能中的另外一个亮点是“Group Replication”。这还是因为了除了互联网客户已经普遍地应用MySQL了,还有很多新增客户是企业级客户,他们要求高可靠性。组复制就是提高可靠性的一个功能,支持自动切换和多写,而多写也提升了高可用性,而且支持多写检测。这个功能当前只支持InnoDB,但很多新功能也支持InnoDB。

MySQL 8.0版本的新功能亮点就是自检表,对于客户而言做好的一点就是就是它支持原子操作的DDL,特别是在云上原子性的DDL发挥了决定的作用,因为很多操作都是自动操作,不可能让人手动修改DDL回滚时发生的错误。这一点对于云数据库而言非常重要。

此外,MySQL 8.0版本还提升了Information Scheme的性能。而无论是系统表还是普通表,都存放在InnoDB里面,因此其处理方式是一样的。对于开发者而言,有了数据自检,增加新的功能就会非常容易。

递归公用表表达式以及窗口函数都是非常复杂的SQL语句,在8.0中加入这两个语句缩短了MySQL和Oracle的差距,这会大幅度地降低数据库开发人员的开发时间。CTE主要用于对于存在层次等级的表中做递归的查询,这一功能在报表中非常常用。窗口函数则是用在分析型工作中的,比如分析每年、每季度的营收等。这些就是在MySQL8.0中新增的针对于数据库开发者的功能,帮助他们提升开发效率。

MySQL的未来

MySQL的未来其实只有一个字,那就是“云”。有预测称“在2020年,83% 的企业负载会转移到云上”,也就是说大部分线下场景会转移到云上,这对于MySQL而言既是一个机会也是一个挑战。MySQL需要在进行内核改动和优化,使其更适合在云上发展。

云上数据库架构存在着明显的转变,最为明显的就是计算层和存储层的分离。计算层不共享,但是存储层会变成共享存储。共享存储会达到云规模,也就是极大规模,能够支持所有用户,这样能够极大地节约资源。而这样的想法已经被PolarDB用到了。而企业级客户需要高可靠性,所以云上数据库需要演变成为可以跨机房的高可靠性,而且需要保证切换的过程中不丢失任何数据。在云上,很切换过程多操作需要自动化,需要保证AC之间的切换不丢失任何数据。云上数据库与传统数据库不同的是需要考虑到云上其他的服务,如何将数据库和备份、恢复、审计、安全以及监控等其他服务进行集成。

资源管理也是值得MySQL提升的部分,有些事务对于响应时间要求很高,这样可以优先处理响应时间较高的任务,而降低其他事务的优先级。此外,当内存不够的时候应该如何处理,不能使得服务宕机。可以进行回滚或者降低新的请求,来保证数据库的稳定状态。此外,还有想做的一件事情就是智能生成执行计划。因为一个SQL进来之后,先解析做优化,产生执行计划,这里需要改进的是在执行计划生成的时候需要考虑更多的事情,比如查询的响应要求以及内存限制。对于查询时间和空间的平衡需要客户自己决定。而现在的执行计划是由优化器自己决定的,在未来希望能够智能地生成执行计划。

回到企业级工作负载,其实MySQL用在互联网业务中是非常多的,但是众所周知互联网业务的查询往往比较简单,而企业级用户的查询相当复杂。MySQL目前对于简单数据库查询的性能非常好,在这一方面做了很多优化,而在复杂查询方面还可以做极多的优化,比如开启多个线程并行执行。同时可以在InnoDB层做更多的并行执行,比如Scan、条件过滤等,因此在复杂查询方面有无限的提升空间。

MySQL目前只用于OLTP,此外目前还以一个发展很快的趋势就是在线分析。未来,MySQL可能会同时支持事务性处理也会同时支持在线分析。在线分析和数据仓库不同,因为数据已经在手里了,可以用同一份数据做更多的分析。对于用户而言,所看到的就是一个数据库,但是所能够包含的功能确是难以想象的。

原文链接

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这