前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL之父解读数据库最新亮点

MySQL之父解读数据库最新亮点

作者头像
腾讯云数据库 TencentDB
发布2020-06-17 10:40:22
1.1K0
发布2020-06-17 10:40:22
举报

本文是MySQL创始人Monty在5月30日"腾讯云CDB/CynosDB技术揭秘"系列直播中的分享实录。


大家好,我是MariaDB的 Michael Widenius,我们今天来简单的聊下MariaDB10.5新特性和即将要做的事情。10.5已经是RC了,应该是下周四GA,所以非常近了。

Monty全程分享视频

从我个人加到MariaDB的特性开始,这也是我现在依然写代码的地方,差不多我花了我至少一半的时间在做这里。实际上在COVID-19期间,我花了90%的时间在做这里,这还是很好的。

其中一个我加到MariaDB10.5的就是S3引擎,这也是我被用户要求要提供一个解决方案的地方,它将帮助用户把历史数据存储在便宜而可靠的存储上面。S3是一个只读的engine。

存储在S3上的是可选压缩,去减少一点存储空间。重要的事情是多种存储,但每个地方都能很好运行、复制,所有的keys。这是非常常规的东西,你平时在用,但一般不注意。 所以,表转换这里,你可以把表直接Alter成S3的表,或者改回来。你可以有主和备,他们所有都是不同的,这展示的是正常的复制的工作,有趣的事情是S3是共享存储,可以让主从都用同一个S3 。所以当主(指的MariaDB的主) 改变后,备不用做什么也能直接读到信息。

你可以任何时间在MariaDB上加server。他是自动发现的,所以你要做的唯一事情是slave加认证,然后就可以访问所有的在S3的表了,不需要做复制,自动感知变化。 到现在为止,我们在MariaDB对MySQL做了很好的兼容,所有的命令,命名等,几乎所有东西都一样。一个可以区别的是他们二进制名字,10.4是软连到MariaDB,10.5改为了二进制是MariaDB为前缀,但依然有老的软连接,保证老的脚本和其他东西运行。一个大的改变就是在进程里面,你看到的是MariaDB,而不是MySQL了 ,这可以让你同时运行MySQL和MariaDB,你就知道谁是谁了。 我们有一些扩展的DDL语法,首先是我们对于create database语句加了 comments,我们让table更容易去使用和rename,也做了一些在alter table 和rename table上的代码修正。我们需要在strict 模式下做table的复制,引擎自动的加if exist到binlog去,所以slave知道是否要跳过,因为他可能不存在是一个share table。 我们已经有returning了,但这次加了insert 和replace的 returning 语法。returning的意思是你可以获取改变的内容返回到客户,所以在insert里面就意味着 插入的数据集都可以被返回,(有时候)可能很重要,例如:

有数据列和元素在replace下,有些会被删除,有了retuning,你就知道了哪些其实不是insert进的(因为replace带有插入和替换两层一次,就是说可以区分 哪些是真的replace,哪些是insert的)。 我们也对于Except 和 intersect 加了对于ALL的语法(也就是说 可以去分集合运算不去重了),这是MariaDB特有的,MySQL没有。我们也做了一些易于MySQL8.0迁移到MariaDB的工作,你也许知道,我们有不同的方式去存储数据,mysql这方面做了一些奇怪的工作,所以我们在快和磁盘的层面不兼容MySQL8.0,但SQL的层面是兼容的,所以大部分应用迁移到MariaDB很容易。 但若要升级,我们做了不少工作让用户从其他版本升级到10.5很容易,不需要改变什么,自动工具升级。 我们有一些对master 和 slave 非常敏感的用户,所以我们把show master status这个指令改成了show binlog status。 我们添加了新的支持JSON的函数,对JSON的支持更友好了。

很多人认为mariadb的超级用户权限太超级了,获得了太多的权限难以控制。所以我们把超级权限分割成了更小的子权限给人们使用。这意味着你可以单独给某个用户获取binlog和binlog操作的权限,但不用把他提升为超级用户。当然了,要使用这样的功能,用户需要做一点小小的权限改动来适配,在10.5版本里我认为这是唯一需要用户适配的修改了。

我们这个版本里,对InnoDB进行了很大的迭代,我们有3个innodb开发,他们做了很多大的工作去改善innodb性能,让它变得更快。同时有很多参数被删除了因为他们几乎没有意义了,还有部分参数被调整了默认值。比如innodb_log_files_in_group,我们知道修改这个值到很高并不能达到任何改善性能的效果,所以现在它默认被设置为1。

这里所有的变量虽然不推荐(仅展示一部分): innodb_checksums innodb_log_checksums innodb_locks_unsafe_for_binlog innodb_stats_sample_pages innodb_undo_logs innodb_rollback_segments innodb_log_optimize_ddl

但依然可以在配置文件使用,启动的时候在errorlog 里面会有warning日志。这对于清理这些配置是一个好的事情,我们相信升级还是很容易的,所以我们把这里做了修改。 现在你可以通过innodb status 去看innodb引擎的状态,同时还有大量的性能改善,如果你从innodb旧版本迁移过来,你的感受会非常强烈。

这里我们会介绍一些改善的点。一个显著的改动是新的线程池(不是连接的那个,是后台线程池),以前启动的时候,为了LRU开启了很多线程,即便不使用也是如此。我们现在有了general的线程池,按需创建,不用会自动减少。

如果你使用的是NVDIMM持久性存储,我们针对这一存储做了优化,使用户能够直接把数据写入持久性存储来分摊文件系统的开销。这一点使mariadb一些性能显著提高了,基本上sync到日志文件的开销降到了0。mariadb会时刻保持更新,和最新的硬件兼容。我们也和cpu的供应商有合作,比如ARM,来确保mariadb能很好的和arm兼容。 我们收到的关于10.4的抱怨之一,是我们的新特性都是基于mysql 5.7 performance shcema,现在mariadb对此作了修复,因此performance_schema表可以提供更多mariadb的信息。和mysql5.7相比,之前我们已经有很好的数据接口来使用内存,现在我们也支持了mysql5.7的接口。

我在使用mysql的时候,尤其关心的是性能。MySQL之所以这么受欢迎的原因之一,也是因为他相较于其他数据库有更好的性能。我们在MariaDB 10.5中保持了这一优势,我自己写了新的二进制文件记录的代码,值得注意的是,改进后的二进制文件比原来更小,处理起来也速度也更快了。我也做了一些范围优化器的改进,移除了10.4版本中的一些优化器的小问题。同时,我也改进了优化器,使得开销能更好的和不同引擎匹配。

例如对于MEMORY引擎来说,即使数据存在内存里,也会像数据存储在硬盘里那样来计算访问开销。这个问题在10.5版本中得到了解决,Mariadb知道存在内存中的表处理会更快,并且更加精确的计算memory表的开销。

我一直在强调和mysql相比,mariadb能非常快的连接到服务器,在SQL中我们能更快的从服务器连接到客户端。10.5中我们更是把连接速度提升了25%。这也是为什么很多用户不像在mysql中那种用连接池来提升性能,因为mariadb中的数据库连接本身就很快了。

当然,在很多不需要使用密码来访问数据库的场景中,我们使用了特殊的逻辑来处理这种内部的使用,使得数据库连接的速度更快。 10.5中我们对Galera做了许多改进,其中最重要的一个就是mariadb支持了Global Transaction ID。因此现在Gerlera支持mariadb最新的全部特性,这使得Gelera的使用更方便也更安全。 关于主从复制,我之前提到过REPLCA已经支持在SQL语句中作为SLAVE的同义词。同时我们也扩展了binlog的元数据以包括新字段。在mariadb 10.5和之后的版本中,添加新的数据类型会更方便。

但是如果你的主从中包含不同的数据类型,我们需要知道更多的信息,比如原始列的信息,来处理更多复杂的情况。新的元数据使得复制和之前相比更安全了。我还提到了IF EXISTS,我们可以在S3引擎中使用IF EXISTS来代替写和修改查询。我们有标识来区分他是否含有隐式的EXISTS。 关于优化器,我们做了很多内部处理来使得优化器更可靠。更合理的部分是,anlyze语句分析了更多的信息,optimizer_trace比原来更快了。我们在使用文件排序的时候,使用的磁盘空间也更少了。如果你用varchar作为文件索引,在之前的文件排序中,会给每一行都用到这个文件索引。在10.5中,我们只存储真正用到的数据,这使得文件排序中的VARCHAR,CHAR和BLOB更快了。 除了上面提到的这些以外,我们还有很多小的改进。我们更新了正则表达式的库到最新的版本。把Aria引擎中键值的长度从1000 bytes增加到了2000。这是很重要的,因为S3存储引擎是基于Aria代码的,我们有用户想要把引擎转换为INNODB,他们在S3中有非常长的键值,我们这个改进主要基于这一点。

10.5中新增了很多新参数,因为实在太多了,我就只在这里放了链接。Knowledge Base(mariadb.com)上有最新功能的文档说明,大家可以去Knowledge Base上搜索10.5,可以找到ppt里所有的内容。 10.5发布之前我们还有一些想要加进去的特性。在GA之前,我们会把哈希连接的使用加进去,其实在10.4和现在的10.5版本中,我们已经支持了哈希连接,但是用户需要设置一些参数来使之生效。我们还在开发优化器引擎,让他自动检测何时使用哈希连接会比普通连接性能更好。

有一些情况下哈希连接始终比普通连接的性能好,比如在没有可用索引的情况下,我们会在10.5中自动使用哈希连接。如果用户忘记添加索引,10.5版本的处理速度会比10.4快很多,因为系统自动使用了哈希连接。

列存引擎在10.5中发生了很大的变化,我没有在这一页中添加过多的内容,因为列存这个话题可以作为一个完整的话题来分享。有趣的是,列存引擎中,每一列都作为单独的二进制表单独存储。列存引擎是专门用来做分析型查询优化的分布式引擎,可以很快的分析处理pb级别的数据。

在mariadb10.5中,列存引擎是可插拔的形式,他有自己的rpm安装包,用户可以很简单的在服务器中添加、删除。这也使得我们对mariadb列存的优化和贡献变得更简单,因为我们不需要单独的二进制表。

我不知道大家是否关注了我们的新闻,大约一年前,mariadb收购了存储引擎Clustrix,一个支持事务的分布式存储引擎。有趣的是,因为clustrix的分布式特性,它可以处理无限制的写请求。

比如用户有一个集群,集群里有三个存储节点,用户增加了三个节点之后,写请求也会翻倍。这个特性会在SkySQL的第一个版本中发布,SkySQL是mariadb下的一款云数据库产品,我们还在决定如何把这个特性加入mariadb的社区版本中,据我所知现在的计划是,用户付费之后就可以使用clustrix所有的特性,社区版还需要一段时间才能发布Xpand。 我们很高兴腾讯对mariadb做出了很多代码上的贡献。mariadb和mysql现在最大的区别之一就是mariadb和社区更好的互动,并把大家在代码上的变更和贡献合并进来。我们很高兴腾讯就是很大的代码贡献者之一,我们希望之后腾讯能对mariadb有更多的贡献。

这里有一些腾讯贡献给mariadb的特性: 压缩二进制日志中的事件,使binlog更小了;我们和腾讯一起做了列存压缩,这一点mysql是不支持的,mysql的一些版本中支持类似的部分,但是也是有限制的,腾讯在列存压缩上特性上对mariadb做出了很大的贡献。 对于InnoDB秒加字段的特性,我们也用相同的模式做了改进。腾讯在mariadb  DDL之前就发布了版本支持秒加字段,刚好腾讯相关的开发人员参加mariadb在中国的会议,会后我们和腾讯的研发一起探讨了腾讯是如何实现秒级加列特性的,并讨论我们能否在这个基础上做一些增加和改进。

这部分工作完成在mariadb 10.3-10.4的版本中,但是在10.4版本中,基于之前的这部分代码我们增加了很多秒级特性,许多innodb里alter table的操作是秒级的,可以在用户对数据库离线无感知的情况下增加、删除列。 几周之前我收到了很多代码贡献可以加进mariadb 10.5中去,DROP TABLE FORCE是我亲自实现的一个功能,我的任务是保证这一特性会以某种形式添加进10.5中。这一页中其余的一些代码贡献都和Marcel(mariadb开发人员)正在做的10.5版本中的特性有关,我们希望这部分能顺利加进10.5,如果不可以,那么将会在10.6中发布。

删除大表优化在我们收到代码贡献之前就已经由Marcel的团队实现了, 他们会参考大家贡献的代码,从而在终版中得到最好的特性。

必须要赞一个!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云数据库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档