作者 felixliang

腾讯游戏风雨十年,一直致力于带给玩家最好的快乐体验,为此也取得了巨大的成功。

腾讯游戏的后台数据库一直守护着亿万玩家的数据,提供着稳定透明的服务。

腾讯后台数据库大部分使用的是MySQL数据库,现已大部分被替换为互娱DBA团队自己定制的TMySQL。IO问题是传统关系型数据库中最热门话题,互娱DBA团队在业务运营过程中同样遇到类似问题。

案例一:IO问题。某游戏的一个大区DB由于数据量过大,内存缓冲池不能完全cache数据,IO瓶颈制约DB整体性能,导致该大区不能提供稳定服务。

案例二:存储空间不足。某游戏的DB在合服过程中,由于数据量过大,导致合服效率极低。

对于上述问题,通用的方案或者是升级硬件,或者是在游戏server层修改存储逻辑,代价都很非常大。互娱DBA团队通过在TMySQL 1.4版本增加InnoDB列压缩功能,对应用层透明并且节省了硬件成本从而有效解决该问题。

列压缩技术方案与应用

互娱游戏的后台数据库经常使用blob/text类型字段来存储数据,业务中blob/text类型字段占据了很大部分的存储空间,如上述提到的案例二中DB中约90%的存储内容为blob/text类型列。对这些blob/text字段进行压缩存储,将大大降低存储空间,从而提高DB整体性能。

一、列压缩技术方案

TMySQL列压缩的实现主要包括语法层面、存储格式、压缩/解压逻辑及导入导出优化等几个方面。

1.列压缩功能是可配置的,为此在TMySQL中增加compressed语法。

2.存储格式:列压缩可以根据字段的长度来判断是否使用压缩存储,因为对于小数据量,压缩比不压缩可能更占用存储空间。目前,判断是否压缩的策略是:如果长度小于256字节,不压缩存储;如果长度大于256字节,压缩存储。压缩格式为:

首字节标记:第一个bit,0表示未压缩(对应就无解压后长度),1表示压缩;第2,3位表示算法类型(现阶段版本只有zlib算法),第6,7,8位表示有几个字节来存储压缩长度。

解压后长度:表示数据在压缩前或解压“压缩的内容”的长度,由于BLOB字段约定的最大长度(longblob)是2^32-1,因此4字节的最大长度已经足够。另外,1-4字节的内容分别表示长度上限为2^8-1、2^16-1、2^24-1,2^32-1。该信息也用于解压后的内存分配。

压缩的内容:就是压缩后的数据。

3.压缩算法

当前版本,压缩和解压基于mysql内置的zlib(1.2.3)压缩库,函数为:my_compress和my_uncompress。

上述定义的格式中,预留了其它类型的算法标记,后续会结合不同压缩算法中cpu开销与压缩率来权衡一种更适当的算法。

4.压缩与解压

压缩和解压处理需要在统一的函数调用位置,该位置确定在存储引擎和server数据交换的handler接口中,即

Server层从存储引擎获取数据前,存储引擎负责解压。

Server层要存储数据,需要把数据压缩处理。

这样解压和压缩都集中在存储引擎和server间的数据交换接口中,存储引擎和SERVER的其他处理就不需考虑数据是否压缩的逻辑,简化整个问题。

压缩接口:row_mysql_store_col_in_innobase_format。由server层传下来的每一个列的数据,都会经由本函数完成数据转换(特殊处理索引)。

解压接口:row_sel_store_mysql_rec。本函数用于将InnoDB层从物理介质上读取到的数据传递到server层的类型。

5.导入导出优化

导入导出优化主要是通过两方面来实现。首先是在server层增加新的语法SELECT SQL_COMPRESSED、INSERT SQL_COMPRESSED。在使用SELECTSQL_COMPRESSED时,DB会略过对压缩数据的解压逻辑,直接导出。

INSERT SQL_COMPRESSED与SELECT SQL_COMPRESSED必须是配套使用的,使用INSERT SQL_COMPRESSED略过压缩逻辑直接存储数据。

其次是通过实现tmysqldump使用SELECT SQL_COMPRESSED语法来获取数据内容,在生成SQL语句时使用对符合条件的SQL使用INSERT SQL_COMPRESSED这种语法。

二、列压缩的应用

1.配置列的压缩属性

在建表时语句指定blob/text类型的列具有compressed属性,这样该列的内容会被压缩存储

支持compressed属性的列类型包括:TINYBLOB,BLOB, MEDIUMBLOB,LONGBLOB, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT。

2. 修改列的压缩属性

对于正在线上运行的数据库,要将对其中的字段增加压缩属性,可以通过alter table来修改,alter table可以取消或增加压缩属性。

因此,只需简单的alter table操作,就可以让DB中特定列压缩存储。以上述案例二的游戏DB中数据为例,一个1.3G的表,通过alter table增加compressed特征后为0.19G,压缩率是15%。在DB中,这样的表是100个,收益明显。

3.透明压缩/解压

列属性指定为compressed之后,TMySQL内部会根据实际需要进行压缩和解压处理。假设ServiceInfo_00.ServiceInfo、ServiceInfo_00.GameInfo列具有compressed属性,以下语句等价关系为

4.导入导出优化

应用TMySQL的列压缩后,在使用mysqldump进行导入导出时,在导出时会执行select操作,那么会对所有的压缩数据进行解压;同样,在导入时也会对需要压缩的数据执行压缩操作。

通过改造mysqldump,增加选项enable-compress-optimization来控制压缩的数据在导出与导入过程中,分别不进行解压与压缩,明显缩减导出及导入的时间。

三、收益与展望

1、收益

互娱的游戏DB中,具有blob/text类型字段的数据表都能够应用compressed特性,目前已有4款游戏使用上该特性。

上述案例二中游戏某大区的gamedb,进行压缩前数据大小为160G,在使用TMySQL的列压缩属性后,数据大小变成20G,压缩率是12.5%。

以该游戏一个区的数据作压力测试,使用压缩特性后DB性能提升显著:

如上图,在100并发下,在A5机型中的QPS由未压缩的253提升到列压缩后的2236,提升了8.8倍。

另外,在该业务的合服(两个或多个大区合并成一个大区)操作中,未压缩与压缩的合服时间对比为14239秒vs 5749秒,时间节省为原来的40.3%。即合服操作导致的停服时间由原来4小时缩短到1.6小时。

2、展望

现阶段已应用TMySQL列压缩功能的游戏DB,已明显感受到使用列压缩带来的收益:包括合服、回档中停机时长大幅度减小等。随着越来越多的游戏DB使用列压缩功能,列压缩带来的收益会越来越可观。

这是典型的使用CPU换取内存和IO的做法,列压缩极大地减少了IO开销,虽说相应增加了CPU消耗,但当前游戏DB服务器的CPU处于相对空闲状态,这是完全可以接受的。后续会对列压缩会提供多种压缩算法,可针对不同应用环境来进行选择从而更合理地平衡IO与CPU的消耗。TMySQL版本未来会不断演进和迭代,内置包括DB云化、冷热数据分离等核心特性,提供业内领先的优质DB服务。

mysql表增加压缩属性_InnoDB列压缩,提升DB性能相关推荐

  1. mysql 指定位置添加列_给MySQL表增加指定位置的列_MySQL

    ALTER TABLE test ADD COLUMN id INT UNSIGNED NOT NULL auto_increment PRIMARY KEY FIRST 给表添加列是一个常用的操作, ...

  2. mysql表增加一行_数据库表增加一行数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. DeepMind论文:深度压缩感知,新框架提升GAN性能(附链接)

    来源:新智元 本文共2200字,建议阅读9分钟. 本文介绍一种将压缩感知和GAN联系起来的创新框架. [ 导读 ] DeepMind提出一种全新的"深度压缩感知"框架,将压缩感知与 ...

  4. DeepMind论文:深度压缩感知,新框架提升GAN性能

    https://www.toutiao.com/a6694045305064653324/ [新智元导读]DeepMind提出一种全新的"深度压缩感知"框架,将压缩感知与深度学习相 ...

  5. 对对象类型和调用方法属性进行存储以提升反射性能

    反射的性能差是一个公认的事实.而最耗性能的还是根据程序集获取要调用的对象,而在对象里搜索要调用的方法所耗性能到不不是很多,如果对象里的方法不是特别的多,而去可以指定相关参数提高搜索的效率,比如Bind ...

  6. pandas使用melt函数将宽表变换为窄表、id_vars参数指定原宽表聚合数据列、value_vars参数指定需要被压缩的数据列(单个、多个)、var_name指定压缩后数据列的名称

    pandas使用melt函数将宽表变换为窄表.id_vars参数指定原宽表聚合数据列.value_vars参数指定需要被压缩的数据列(单个.多个).var_name指定压缩后数据列的名称.value_ ...

  7. mysql数据库表空间压缩,表空间中有数据也可以压缩表空间(数据文件)大小!!...

    首先说声抱歉,在 中提出以下观点,经过研究请教,发现观点都是错误的,在这里给予更正. 3.得知表空间中有数据不能resize数据文件的大小:要想resize数据文件,那么表空间中必须没有数据. 更正后 ...

  8. mysql增加列耗时_实战-130W表增加字段耗时

    工作需要对130W的表增加字段,因为是操作线上数据库,所以提前在本地调查下耗时. 首先建表: CREATE TABLE `alter_cloumn_test` ( `id` int(11) unsig ...

  9. mysql 修改列名和属性_mysql增加列修改列名列属性以及删除列

    首先推荐一本初学者的书,一个小册子:<mysql必知必会>简介实用,权威:有点贵,昨天才买的. http://www.2cto.com/ebook/201112/30389.html 正文 ...

最新文章

  1. 美团某程序员困惑:辅导组里妹子两三年,对方工作依然不行,想让她走又不舍得,怎么办?...
  2. python nltk lemmatizer_Python聊天机器人–使用NLTK和Keras构建第一个聊天机器人
  3. Linux中使用Msmtp+mutt+shell自动发邮件程序安装说明
  4. html5手机电商网页设计代码_Html5网站制作,干货!20个视觉体验和内容俱佳的优秀网页设计...
  5. SQL Server安装文件挂起错误解决办法
  6. 【赠书福利】不扶好眼镜,请别打开这本挑战JS语言特性的书
  7. 二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6
  8. ajax返回的数据怎么显示出来_Excel输入汉字、拼音首字母就能显示数据出来,录数据时逐步提示...
  9. 华为搭载鸿蒙2.0系统的手机,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
  10. 大数据是国家目前急需的技术领域
  11. Swift类属性 static
  12. 线性调频信号及仿真[python]
  13. linux最大lun空间,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
  14. pytorch(6)--深度置信网络
  15. HTML+CSS网页制作——恒德电子
  16. maven自动部署到tomcat9
  17. 如何找mysql my.cnf_mysql 查找 my.cnf位置
  18. Qt 之 Concurrent Run
  19. docker访问宿主机文件目录
  20. php 腾讯云 短信验证码发送

热门文章

  1. 2006年中国软件收入规模前100家企业名单(转自sina)
  2. 从Windows到Linux(二)
  3. Js常用方法:JS字符串截取、数组截取等
  4. 英灵神殿服务器本地文件夹,Valheim英灵神殿服务器搭建教学[多图]
  5. jeecms 修改后台访问路径
  6. 服务器维护必刷稀有宠物,魔兽怀旧服,10年圆梦的稀有宠物,记一个魔兽老玩家的坚守...
  7. Linux 单用户修改root密码
  8. Windows7更新之Windows10系统
  9. 如何提高逻辑思维的能力?
  10. 台式计算机如何共享网络,2台台式计算机如何与无线路由器共享网络