## 前言 && 感想
本年度Oralce Open World会议从十月25号到29号,在美国旧金山举行。数万来自全球各地的从业人员涌入Moscone Center,见证一年一度的Oracle生态系统盛事。
本次OOW2015的主题都是围绕在Oracle Cloud,云服务应该是Oracle之后的发力点。几场Oracle CTO(前Oracle CEO)Larry的主题演讲也围绕cloud,详细阐述了Oracle Cloud的设计原则,及相关的云产品,其目标直指Amazon和Microsoft的云服务。
我在OOW的关注点主要是几场KeyNote以及MySQL相关的Topic。先总结下参会的感受吧:
1. Oracle的主场还是集中在Oracle database, Oracle Cloud以及Java。而“不太会赚钱”的MySQL主题则安排的比较少,会场也都是最小的;
2. 关于MySQL,前几天MySQL5.7版本在前几天刚刚宣布GA,因此本次会议的官方主题都是关于新版本的特性介绍,新的版本带来了大量新特性(例如GIS、Build-in JSON、新的Fulltext Parser、Generated Column)以及性能优化(复制性能、InnDB读写性能),大量内部锁竞争的移除,使得新版本MySQL能够在多核环境下更好的Scale Up,发挥硬件的性能;
3. 大部分内容都是已有的技术,并没有什么新的黑科技;
4. 也有几家美国公司来介绍他们如何使用MySQL,但类似Facebook、Twitter这样的MySQL重度用户且对社区有很大贡献的公司却集体缺席,不得不说是个很大的遗憾;
5. 从这几家公司使用MySQL的情况来看,我感觉阿里在MySQL领域的工作绝对是首屈一指的,没有多少公司像我们这样把MySQL玩的这么深入,这么深度的修改源码来适应我们的环境。明年如果有机会,不管谁去参加,我觉得都可以考虑去做几个主题演讲,宣传公司在MySQL社区的影响力;
6. 从交流了解到,美国很多互联网公司都选择把服务器托管在AWS上。未来阿里云的国际化,需要把我们的技术影响力扩展到国外,才能争取到这样的用户。
以下是这五天期间我关注的几个Topic,主要从Oracle 、MySQL官方演讲、业界使用三个方面划分。
## Oracle主题
### Oracle OpenWorld Welcome Keynote [KEY10818]
Larry Ellison, Executive Chairman of the Board and Chief Technology Officer, Oracle
Brian Krzanich, CEO, Intel Corporation
[视频链接](https://www.oracle.com/openworld/on-demand/index.html)
当天第一场重磅keynote,由intel的CEO主持,这次会议着重强调Intel和Oracle的深度合作带来的价值,顺便开刷了下IBM在云计算领域的落伍。最后压轴的是Larry的演讲,主题是Oracle Cloud服务,他明确指出了其在SAAS领域的对手是Salesforce,PaaS领域的对手是微软而不是IBM,IaaS领域的对手是Amazon(Aliyun在美国还是籍籍无名啊…)。相对于这些竞争对手,Oracle要做全平台的云服务提供商:在SaaS提供全部种类的商业应用,例如CX、HCM、ERP、EPM等;在PaaS领域提供完全符合工业标准的平台服务;在IaaS领域突出安全性、可靠性、低开销,标准化的基础设施服务。
为了达成上述目标,Larry从以下几个角度阐述了Oracle云服务的设计目标:
第一是低成本(cost),包括价格上具备竞争优势,通过自动化降低人力成本和人为误差,更轻易的创建和使用应用来减少成本。
第二是高可用性(reliability),实现零宕机时间。两个方面:
1. fault tolerant,通过冗余设计,hot patching及备份,即时恢复来实现;
2. 自动化(automation),消除在部署、补丁、备份及恢复期间的人为错误。
第三是高性能,从三个方面阐述:
1. 数据库,in-memory in-flush的列式数据库,部署在云中的Exadata;
2. 中间件,In-memory speed-of-thought Analytics; 3.Sale-out架构,弹性能力,和按需获的性能。
第四是标准化,支持工业标准的SQL、Hadoop、NoSQL等等,让用户能够无锁定的自由迁移到其他云服务平台。
第五是兼容性,能够自动迁移负载和数据。例如从公有云和私有云之间自由迁移。
第六是安全性,能够持续的抵御黑客攻击。最新发布的SPARC M7处理器在硬件层支持实时的安全监测;另一方面也提供数据加密。
在阐述上述观点后,随后发布了一大堆的云产品,Oracle强势宣布了其正式进入了云计算领域。
### Exploring Oracle Database 12c New Features Best Practices for DBAs and Developers [UGF7904]
Ami Aharonovich, CEO, DBAces-ilOUG
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2316/UGF7904_Aharonovich-Oracle%2012c%20New%20Features%20for%20Developers%20and%20DBAs%20-%20October%202015.pdf)
介绍了Oracle 12c的一些新特性,以及如何使用这些特性,作为一名MySQL开发,最让我感兴趣的是MySQL中没有的功能,以及是否能将Oracle的这些功能也实现到MySQL中去。以下是几个笔记的点。
隐藏列属性:定义为“column_name TYPE INVISIABLE”。当设置该属性后,这个列的内容对客户端而言就是不可见的,但如果显式的指定列名的话,则可以对该列进行操作,主要用于类似应用迁移之类的场景,例如增加新的列,不影响老的应用,同时新的应用也可以通过指定列的方式进行操作。MySQL可以考虑把这个特性Port过来。[这个文档](https://oracle-base.com/articles/12c/invisible-columns-12cr1) 有对该特性的描述。
默认的sequence值:可以默认获取一个新的sequence值(定义为column_name TYPE DEFAULT seq_name.nextval),另外一种方式是在列上定义一个[IDENTIFY](https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1)属性(id NUMBER GENERATED ALWAYS AS IDENTITY)仔细想想,这货不就是MySQL的Auto-Increment属性么。
Data Redaction:顾名思义,就是数据修订的意思,对返回给客户端的值进行修订,例如将敏感信息用”*“代替返回。有FULL Redaction、Partial Redaction、Regular expression、Random Redaction、No Redaction几种。如下图所示:
![](https://box.kancloud.cn/2015-11-17_564aa53aac099.png)
reduant
具体介绍参阅[这篇文章](https://docs.oracle.com/cloud/latest/db121/ASOAG/redaction.htm#ASOAG594)。
下图描述了这个特性的一个典型应用。感觉是个比较有意思的特性,后面看看怎么做的,可以考虑实现到MySQL里
![](https://box.kancloud.cn/2015-11-17_564aa53ac943e.png)
red use
更好的加列操作:如果列的值允许为NULL,加列操作不会产生表上所有记录更新,而是修改元数据。当查询到这个列时,如果尚未有数据,则从元数据中获得其default值,并返回给客户端。同样的思路可以应用于MySQL。
Adaptive Execution PLan:运行过程中自动调整执行计划,最终的计划取决于执行过程中看到的行数。
在该演讲slide的最后贴了大量关于Oracle 12c相关的链接,感兴趣的可以点开了解下。
### General Session: Software in Silicon and SPARC Outlook—Secure, Smarter Database/Applications [GEN6421]
Masood Heydari, SVP, Hardware Development, Oracle
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2257/GEN6421_Heydari-GEN6421-Heydari-OOW2015.pdf)
介绍新发布的SPARC M7 处理器,其性能强悍,号称有32个core,256线程,4.13GHZ,64MB的L3 Cache, 支持最大2TB的物理内存,支持4路DDR4 内存控制器; 并且相比前一代有3倍IO带宽提升;该处理器还支持Silicon Secured Memory, DB query Acceleration,Inline Decompression,将软件功能集合到硬件中,从而最大化发挥效率。其号称世界上最快的微处理器,其基于硬件的内存安全防护,能够防止黑客非法访问内存内容
## MySQL官方演讲
### How to Analyze and Tune SQL Queries for Better Performance [TUT3411]
Oystein Grovlen, Senior Principal Software Engineer, Oracle
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2293/TUT3411_Grovlen-How%20to%20Analyze%20and%20Tune%20SQL%20Queries%20for%20Better%20Performance-OOW2015.pdf)
演讲者为MySQL团队优化器模块的开发人员,重点介绍了优化器的相关知识,包括优化器的执行过程, MySQL 5.7引入的cost model ,5.6版本之后引入的物化统计信息。
其中比较有意思的点是cost model,介绍了用户如何通过设置cost model来影响优化器的行为。
通过实例介绍了索引选择的类型,介绍了join和子查询是如何进行优化器选择的,以及排序和聚合操作。 该演讲的slide干货满满,对优化器感兴趣的同学非常值得一看。
### MySQL Replication Tips and Tricks [TUT5467]
Joao Gramacho, Software Developer, Oracle
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/1651/TUT5467_Gramacho-2015-TUT5467-MySQLReplicationTipsAndTricks-v11.pdf)
详细介绍了MySQL的复制模块,以及大量的使用技巧及5.7的新特性,从浅显的知识到更深入的讨论都有涉及,适合对复制模块感兴趣的各个层次人群阅读。
### InnoDB: What’s New in MySQL 5.7 [CON3716]
Sunny Brain, InnoDB Developer Manager
暂无PPT
InnoDB的开发主管Sunny Brain介绍了MySQL5.7对InnoDB模块的改进,总的来说,主要包括以下几点:
General tablespace: 一种用户定义的表空间,在磁盘上会生成一个ibd文件,可以指定表空间名来创建表,这些表的数据都存储到一个ibd文件中。
Virtual column:支持虚拟列,即用户通过预设的表达式定义的列,这样的列不存储数据,但支持基于其上建立索引。一种典型的应用是基于Json类型数据之上,使用json相关函数创建虚拟列。隔天Jimmy Yang有个演讲专门介绍这一块。
native partition:将分区表的引擎接口从Server层转移到InnoDB层,这意味着之前每个分区都需要一个存储引擎接口,现在则只需要一个引擎接口,对于包含大量分区的分区表而言,可以减少不少内存消耗。另外这种改变,也使得未来基于分区表做并行查询更加简单。
全文索引:改进了全文索引,可以更好的支持中文全文索引分词,这极大的弥补了5.6版本InnoDB全文索引的不足之处,从5.7版本开始,MySQL用户可以完全抛弃MyISAM引擎的全文索引
R-Tree Index(GIS Support):开始支持GIS空间数据类型,弥补了MySQL和其他数据库(如PostgreSQL)相比的一大缺憾,GIS对当前基于地理空间的应用是非常重要的功能。
性能优化:在5.7版本对读写性能做了大量的优化,例如优化了读写事务链表的管理,Read View缓存(两个只读查询之间没有新的读写事务,则认为read view是可重用的),消除了大量的事务锁瓶颈。基于这些改进,新版本的性能(尤其是读性能)能够在多核场景下获得更好的性能。 在讨论到Read view缓存时,我发现在RC隔离级别下,这一优化策略并没有生效,和Sunny讨论了下这个问题,他表示认同。
索引锁优化:引入SX Lock,在对btree做分裂或合并操作时,不再锁住整棵btree,从而降低对读负载的影响。
事务生命周期特性: (主要用于支持5.7另外一个新特性:Group Replication),包括高优先级事务,高优先级获取记录锁(可以从记录锁队列中往前跳),kill其他低优先级事务。目前这几个特性还对终端用户不直接可见。
DDL优化:对于索引创建,在之前的版本中使用先排序数据,再执行插入到新btree中的方式,而新版本则使用自低向上的索引构建方式,即先构建叶子节点,再从叶子节点开始构建非叶子节点,这样具有极高的索引创建效率。
Intrinsic table:主要被优化器使用,在之前版本中使用的是MyISAM引擎来作为查询过程中产生的临时表引擎;在5.7版本中,InnoDB对临时表(intrinsic table)做了大量优化,包括独立的临时表表空间,独立的undo回滚端,减少redo log的记录。下图是他们的性能比较图,可以看到InnoDB在高并发下能获得更好的性能。
![](https://box.kancloud.cn/2015-11-17_564aa53ae088b.png)
intrinsic table
Memcached: 由于消除了大量的性能瓶颈,MySQL5.7的Memcached Plugin相比5.6有了数倍的提升,而在稳定性上,也修复了大量的bug,相信5.7版本能够改变5.6版本Memcached plugin无人问津的窘境。
![](https://box.kancloud.cn/2015-11-17_564aa53b07463.png)
memcached
其他还包括诸如大Page Size支持,CRC32的Redo log校验,多个Page cleaner线程及buffer pool刷脏逻辑优化。
总的来说,MySQL5.7是个非常值得期待的版本。
### Building Scalable, High-Availability Systems Using MySQL Fabric [CON4975]
Mats Kindahl, Senior Principal Software Developer, Oracle
暂无PPT
介绍了MySQL新组件Fabric,主要用于构建高可用,可扩展的系统。Fabric本质上是一组脚本,算是官方出品的HA和Sharding工具。由于阿里在这一块已经非常的成熟,我对Fabric本身并不感兴趣,感兴趣的可以参阅[官方文档](http://dev.mysql.com/tech-resources/articles/mysql-fabric-ga.html)。而对为了支持fabric对服务器端代码做的改动比较感兴趣。
总的来说,为了支持Fabric,MySQL本身做了几点改动:
实现一种新的方法来清理session的状态,可以reset 已有的会话,例如清理其内容并释放资源(WL#6797),这在我们RDS里也有类似的实现。
允许MySQL服务器进入一种离线状态,让已有的连接优雅的断开(SUPER账户除外),这主要用于升级或者维护服务器。该特性也用于fabric来辅助管理MySQL集群。(WL#3836)
增加一个服务器层的flag来判断是否有一个新的事务开启了,主要用于连接池的负载均衡,如果一个session未开启事务,就可以把它的请求调度给别的连接。 (WL#6631)
另外在29号也有另外一个关于Fabric的主题演讲,[参阅PPT](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/3373/CON5209_Correia-CON5209%20-%20MySQL%20Fabric%20Tips%20and%20Tricks%20-%20OOW%202015.pdf)。
### MySQL 5.7: What Is New in the Optimizer? [CON3379]
Manyi Lu, Senior engineering manager, Oracle
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2093/CON3379_Lu-OptimizerOOW2015.pdf)
负责MySQL服务器层的开发主管介绍了MySQL5.7版本对Optimizer模块的优化,主要包括如下几个方面的改进。
Generated Column:用户可以在建表或ALTER时创建的一种新的列类型,列的数据可以通过一个预设的表达式来进行计算,如下建表语句:
~~~
CREATE TABLE order_lines
(orderno integer,
lineno integer,
price decimal(10,2),
qty integer,
sum_price decimal(10,2) GENERATED ALWAYS AS (qty * price) STORED );
~~~
最后一个列的值为qty列和price列相乘得到。STORED属性表示在插入或更新时计算该列的值并存储到物理文件中。你也可以选择VIRTUAL属性,这样就只在查询时计算。这可以满足一些特殊的需求:例如实现基于方法的索引,物化缓存复杂的条件,简化查询SQL表达式。
JSON Support:支持内建的JSON类型的数据存储,并提供一组JSON函数。使用也比较简单,直接将列类型定义为JSON。
对于JSON类型的数据,在插入或更改时,会进行格式检查,通过新的语法和函数,也可以更方便的操作JSON数据。
和Generated Column相结合,我们还可以对json中的数据进行索引创建,从而索引json中的某个数据段。
PS:当天有另外一个演讲专门对JSON[做了介绍](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2644/HOL8467_Kojima-HOL8467.pdf)
Cost Model:用户可以根据自己的硬件场景来配置cost model,进而影响优化器的选择。基于5.7的cost model,解决了如下几个问题:
1. 对于JOIN操作的记录数估计不准确;
2. hard-code的代价常量;
3. 不准确的record-per-key,使用浮点数代替;
4. 使用json输出explain的结果。Manyi Lu强调在下一个版本中,他们会着重解决优化的cost model自动调整功能,而不是依赖人来配置。
新的HINT表达式:在插叙中使用 /+ …/ 来开启一些优化器或者其他选项,例如BKA, BNL, MRR, ICP, SEMIJOIN, SUBQUERY,MAX_EXECUTION_TIME等等常用HINT。
Query Rewrite Plugin:一种新的插件类型,主要解决的问题是在不修改应用的情况下,更改其SQL的行为,例如如果优化器总是为这个SQL选择错误的执行计划,就可以为其加上hint做强制索引选择。
UNION ALL问题:在5.7版本终于解决了臭名昭著的UNION ALL总是创建临时表的问题,多个表做UNIALL ALL时,数据先存储到临时表,然后再发送,但UNION ALL并不需要结果集的顺序性和唯一性,没有必要构建临时表来作去重。
IN表达式优化:在之前的版本中,对于这样的表达式WHERE (a, b) IN ((0, 0), (1, 1)),即时(a,b)上存在索引,也无法使用IN表达式中的值去查询索引,在5.7解决了这个问题,可以使用索引做range scan。
EXPLAIN:可以去查看一个正在运行的SQL的执行计划,这个特性对我们诊断问题非常有用。
最后Manyi Lu罕见的给出了下一个版本优化器模块的RoadMap(Oracle的开发人员通常不会对下一阶段的开发发表评论),包括:
1. 改进对存储过程的支持;
2. 增加类似oracle的直方图;
3. 支持并行查询;
4. 公用表表达式(Common table expression) 。
在后面的讨论中,Manyi Lu也透露了“查询计划缓存”也在开发的计划中(尽管这里没有列出来)。
从优化器的进化可以看出来,MySQL的优化器模块开始变的越来越像Oracle了。希望新版本的MySQL5.7能够改变人们一向的“MySQL优化器很弱”的印象。
### Update Everywhere with the MySQL Group Replication Plugin [CON5349]
Nuno Carvalho, Principal Software Engineer, Oracle
暂无PPT
介绍了MySQL的一种新的插件类型:Group Replication plugin,主要用于类似active-active复制拓扑结构的集群管理,支持多个节点更新,自动冲突检测,自动增删节点等功能,类似MariaDB的Galera。Group Replication目前已经到了0.6.0版本,但还没有正式GA。
使用Group Replication,需要保证使用的表都是InnoDB表,并且定义了主键。Binlog需要使用Row模式。
Group Replication的分布式一致性协议基于XCom,一种PaxOS协议的变种。
关于冲突检测,开发了一组[Group Communication 工具集](http://mysqlhighavailability.com/group-communication-behind-the-scenes/),提供了完全有序的广播,也就是说,消息在所有的节点都按照同样的顺序进行应用。当产生一个新的更新消息时(以类似binlog row格式存储):
1. 在当前实例上完成,但block在commit阶段;
2. group communcattion组件会负责将消息发送到所有依然活跃的节点。
3. 最关键的是决定本地事务是该提交还是回滚。这就涉及到如何进行冲突检测,每个行记录都有一个版本信息,在行被更新时,版本也会递增。主要通过节点间行记录的版本信息来进行冲突检测;
4. 如果不存在冲突,则全部提交;否则全部回滚。
版本信息是通过GTID维护的,所有实例的UUID是全局统一的,并保证了所有节点产生的GTID不会重复。有两个版本信息,一个是database version,也就是本地的version(dbv),另外一个是确认模块的version(cv),下图是一个典型的冲突解决场景:
![](https://box.kancloud.cn/2015-11-17_564aa53b23ba1.png)
group replication
关于一个事务在Group Replication集群中的生命周期,参阅[这篇博客](http://mysqlhighavailability.com/mysql-group-replication-transaction-life-cycle-explained/)
关于节点踢出和重新加入的逻辑,参阅[这篇文章](http://mysqlhighavailability.com/distributed-recovery-behind-the-scenes/)
如何[使用Group Replication](http://mysqlhighavailability.com/getting-started-with-mysql-group-replication/)
在[官方博客](http://mysqlhighavailability.com/)上还有不少文章介绍Group Replication,感兴趣的可以深入研究下。
### What’s New in MySQL 5.7 Security [CON1559]
Georgi Kodinov, Senior Software Development Manager, Oracle
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2512/CON1559_Kodinov-OOW15%20CON1559%20What%27s%20new%20in%20MySQL%20Security.pdf)
主要介绍了MySQL 5.7 包含的一些安全特性。包括:
企业版特性:
1. SQL防火墙用于包含实例免受预期外的SQL注入侵害;
2. 企业版数据加密。
账户管理:
1. 增加ALTER USER语法来修改用户权限。
2. 临时权限禁止功能;
3. 基于时间的权限失效策略;
4. 服务器提供offline模式。
重构及新功能:
1\. 新的权限表格式;
2\. 提供基于AES的加解密函数;
3\. mysql_secure_install/mysql_install_db使用c语言进行了重构;mysql_upgrade不再调用外部程序。
## 业界使用
### MyRocks: MySQL on RockDB
Yoshinori Matsunobu, database developer at facebook
由于26号没有什么比较值得关注的主题,我们应facebook的邀请,26号下午去拜访了Facebook的MySQL开发团队,了解了下之前我们一直关注的MyRock开发情况,他们的开发Yosh专门为我们做了介绍。
说到MyRock,需要先介绍下RockDB。RockDB是facebook基于LevelDB的一个分支,他们在其上做了大量的优化,目前已经集成到Mogodb 作为一个plugin,Percona公司也开始针对RockDB提供技术支持。RockDB基于LSM存储结构,能够有效的减少磁盘擦写的次数,这对Facebook非常重要,因为在他们那里flash设备已被广泛使用,通过rockdb能够有效的控制磁盘成本。另外更大的SST 文件块大小相比InnoDB获得更好的压缩效果,减少磁盘的存储空间。
但是RockDB仅仅支持key-value,并没有SQL接口,如果想用rockdb取代已被广泛使用的InnoDB,应用修改的成本巨大,因此他们启动了MyRock项目,将RockDB包装成MySQL的一个存储引擎。Yosh透露预计明年会出一个GA版本,目前还处于开发状态,他们也在该项目上和MariaDB进行紧密合作。
为了进一步减少磁盘空间,他们实现了“prefix key encoding”,即对于具有相同前缀的行记录,这些相同的列值只存储一次。不过这样也带来了一些负面作用,即需要在建表时设定是正序存储还是逆序存储,因此需要和应用方商量好。
由于LSM具有分层结构,对查询并不友好,最差情况下每个level可能都需要查询一遍。一次带order by的range scan需要将多个level的结果进行merge,这不像基于Btree结构的InnoDB,直接做一次顺序扫描即可。为了优化该场景,他们在MyRock中引入了bloom filter来加速查询,快速确认某个level是否有需要的记录,减少不必要的IO。
目前MyRock还有一些限制,包括:不支持Online DDL、Foreign Key、Spatial Index、以及Fulltext;所有表必须有primary key;不支持next-key lock,并且必须使用row格式复制;不支持binlog和myrock的XA;ORDER BY DESC/ASC 由于prefix key encoding,总有一个会比较慢点;大量删除操作会影响到整体性能。
总的来说,他们并不期望myrock能完全取代InnoDB,只是期望在某些场景下能利用LSM的优点。目前该项目公布在github上,代码的开发进度、提交日志一目了然,不得不让人敬佩facebook的开源和社区合作精神。
### A Global Transaction Identifier Rollout at Dropbox [CON4766]
Rene Cannao, MySQL DBA, Dropbox
David Turner, Database Administrator, Dropbox
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2348/CON4766_Turner-Rolling%20out%20gtids%20at%20Dropbox%20%282%29.pdf)
Dropbox公司分享了他们如何使用GTID。没啥新东西,主要的问题还是GTID无法动态调整,导致整个MySQL集群无法升级到5.6及之后版本的问题,这个问题在社区(例如Facebook和booking)都做了些简单的patch来绕过这个问题,咱们的RDS MySQL也有相应的改动。 这个问题在5.7版本得到了彻底的解决。Gtid的开启和关闭被划分成了多个阶段,来保证整个复制拓扑的GTID一致性
### Making MySQL More Efficient at Pinterest [CON3654]
Ernie Souhrada, Database Engineer, Pinterest
Robert Wultsch, Database Engineer, Pinterest
暂无PPT
Pinterest公司的两位数据库工程师(实际上他们整个team就两个人),一个是前Percona员工,一个是前Facebook员工。他们分享了Pinterest如何让MySQL更高效。
由于只有两名员工,他们选择更多的依靠已有的技术,例如备份使用MySQL Enterprice Backup。他们提到一个比较有意思的问题是,在数据库中他们存储了大量的JSON数据,这些数据列的大小平均为1.2kb。正好他们看到了我们以前分享的关于单列压缩的改进,在他们的场景下测试得出的结论是,列压缩在保证性能的基础上,依然能提供不错的压缩比。
他们在列压缩的基础上,对这个功能进行了扩展,方案交给Percona进行开发。也就是所谓的Predefined Compression dictionary。会后和他们交流了具体的方案,了解了这个改进的具体内容:
其本质是将需要压缩的数据预先定义好,然后在全局使用这个预先定义的数据词典进行压缩。定义两张系统表,一张系统表存储数据词典信息,另外一张表存储列与数据词典的映射。
由于预先定义好了压缩前缀词典,即时一个字符串在某个列中只出现了一次,也是可以被压缩的。
压缩前缀词典可以通过训练已有的数据集得到。这确实是一个非常有趣的思路,对他们的这种场景,减少了72%的磁盘占用。
### Binlog Servers at Booking.com [CON4098]
Jean-François Gagné, Senior System Engineer, Booking.com
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2705/CON4098_Gagne%CC%81-binlog_servers%40booking.com_oow2015.pdf)
来自booking的开发人员介绍了他们的binlog server工具,根据其描述,其工作原理就是一个独立的server,从master上读取binlog,存储到本地;然后将自己当做一个“假”的master,将binlog分发到各个slave节点。
在阿里,我们早几年就有了类似的工具,例如DRC, Transfer,精卫等。不过booking结合binlog server实现了其生产环境的高可用,读扩展以及时间点恢复功能。
### YouTube Vitess: Cloud-Native MySQL [CON11339]
Anthony Yeh, Software Engineer, Google
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2266/CON11339_Yeh-Vitess.pdf)
来自谷歌的工程师介绍了Youtube的开源项目Vitess。对分布式中间件不太了解。没啥感觉
### Feed Your Streams: Zendesk’s Maxwell Generates Kafka Event Stream from MySQL Binlogs [CON3340]
Ben Osheroff, Principle Engineer, zendesk.com
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/1969/CON3340_Osheroff-Maxwell%20Talk.pdf)
zendisk的工程师分享了另外一款开源的工具,同样也是用于解析Binlog的,不同的是,把binlog的内容解析成了json的格式并复制到Kafka,算是玩出了新意。例如解析出来的数据如下图所示:
![](https://box.kancloud.cn/2015-11-17_564aa53b37e06.png)
zendisk
### Yahoo Case Study: MySQL GTIDs and Parallel or Multithreaded Replication [CON5409]
Yashada Jadhav, MySQL DBA, Yahoo
Stacy Yuan, Sr. MySQL DBA, Yahoo
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/685/CON5409_Jadhav-Yahoo%20Case%20Study-%20MySQL%20GTIDs%20and%20Parallel%20or%20Multithreaded%20Replication.pdf)
主要讲了Yahoo关于GTID的使用,介绍了下复制的相关知识以及如何使用Percona版本的MySQL实现online GTID开启。没啥新意,看在难得是妹子的份上听了一会就闪了。但对这块不了解的同学可以看看。
### Database Defense in Depth [CON3554]
Geoffrey Anderson, Senior Database Operations Engineer, Box
[PPT链接](https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/2311/CON3554_Anderson-databaseDefenseInDepth-oow2015_print.pdf)
Box公司的DBA阐述了他们如何使用各种工具来解决MySQL遇到的问题,以保证MySQL的正常运行。没啥新东西。
- 数据库内核月报目录
- 数据库内核月报 - 2016/09
- MySQL · 社区贡献 · AliSQL那些事儿
- PetaData · 架构体系 · PetaData第二代低成本存储体系
- MySQL · 社区动态 · MariaDB 10.2 前瞻
- MySQL · 特性分析 · 执行计划缓存设计与实现
- PgSQL · 最佳实践 · pg_rman源码浅析与使用
- MySQL · 捉虫状态 · bug分析两例
- PgSQL · 源码分析 · PG优化器浅析
- MongoDB · 特性分析· Sharding原理与应用
- PgSQL · 源码分析 · PG中的无锁算法和原子操作应用一则
- SQLServer · 最佳实践 · TEMPDB的设计
- 数据库内核月报 - 2016/08
- MySQL · 特性分析 ·MySQL 5.7新特性系列四
- PgSQL · PostgreSQL 逻辑流复制技术的秘密
- MySQL · 特性分析 · MyRocks简介
- GPDB · 特性分析· Greenplum 备份架构
- SQLServer · 最佳实践 · RDS for SQLServer 2012权限限制提升与改善
- TokuDB · 引擎特性 · REPLACE 语句优化
- MySQL · 专家投稿 · InnoDB物理行中null值的存储的推断与验证
- PgSQL · 实战经验 · 旋转门压缩算法在PostgreSQL中的实现
- MySQL · 源码分析 · Query Cache并发处理
- PgSQL · 源码分析· pg_dump分析
- 数据库内核月报 - 2016/07
- MySQL · 特性分析 ·MySQL 5.7新特性系列三
- MySQL · 特性分析 · 5.7 代价模型浅析
- PgSQL · 实战经验 · 分组TOP性能提升44倍
- MySQL · 源码分析 · 网络通信模块浅析
- MongoDB · 特性分析 · 索引原理
- SQLServer · 特性分析 · XML与JSON应用比较
- MySQL · 最佳实战 · 审计日志实用案例分析
- MySQL · 性能优化 · 条件下推到物化表
- MySQL · 源码分析 · Query Cache内部剖析
- MySQL · 捉虫动态 · 备库1206错误问题说明
- 数据库内核月报 - 2016/06
- MySQL · 特性分析 · innodb 锁分裂继承与迁移
- MySQL · 特性分析 ·MySQL 5.7新特性系列二
- PgSQL · 实战经验 · 如何预测Freeze IO风暴
- GPDB · 特性分析· Filespace和Tablespace
- MariaDB · 新特性 · 窗口函数
- MySQL · TokuDB · checkpoint过程
- MySQL · 特性分析 · 内部临时表
- MySQL · 最佳实践 · 空间优化
- SQLServer · 最佳实践 · 数据库实现大容量插入的几种方式
- 数据库内核月报 - 2016/05
- MySQL · 引擎特性 · 基于InnoDB的物理复制实现
- MySQL · 特性分析 · MySQL 5.7新特性系列一
- PostgreSQL · 特性分析 · 逻辑结构和权限体系
- MySQL · 特性分析 · innodb buffer pool相关特性
- PG&GP · 特性分析 · 外部数据导入接口实现分析
- SQLServer · 最佳实践 · 透明数据加密在SQLServer的应用
- MySQL · TokuDB · 日志子系统和崩溃恢复过程
- MongoDB · 特性分析 · Sharded cluster架构原理
- PostgreSQL · 特性分析 · 统计信息计算方法
- MySQL · 捉虫动态 · left-join多表导致crash
- 数据库内核月报 - 2016/04
- MySQL · 参数故事 · innodb_additional_mem_pool_size
- GPDB · 特性分析 · Segment事务一致性与异常处理
- GPDB · 特性分析 · Segment 修复指南
- MySQL · 捉虫动态 · 并行复制外键约束问题二
- PgSQL · 性能优化 · 如何潇洒的处理每天上百TB的数据增量
- Memcached · 最佳实践 · 热点 Key 问题解决方案
- MongoDB · 最佳实践 · 短连接Auth性能优化
- MySQL · 最佳实践 · RDS 只读实例延迟分析
- MySQL · TokuDB · TokuDB索引结构--Fractal Tree
- MySQL · TokuDB · Savepoint漫谈
- 数据库内核月报 - 2016/03
- MySQL · TokuDB · 事务子系统和 MVCC 实现
- MongoDB · 特性分析 · MMAPv1 存储引擎原理
- PgSQL · 源码分析 · 优化器逻辑推理
- SQLServer · BUG分析 · Agent 链接泄露分析
- Redis · 特性分析 · AOF Rewrite 分析
- MySQL · BUG分析 · Rename table 死锁分析
- MySQL · 物理备份 · Percona XtraBackup 备份原理
- GPDB · 特性分析· GreenPlum FTS 机制
- MySQL · 答疑解惑 · 备库Seconds_Behind_Master计算
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
- 数据库内核月报 - 2016/02
- MySQL · 引擎特性 · InnoDB 文件系统之文件物理结构
- MySQL · 引擎特性 · InnoDB 文件系统之IO系统和内存管理
- MySQL · 特性分析 · InnoDB transaction history
- PgSQL · 会议见闻 · PgConf.Russia 2016 大会总结
- PgSQL · 答疑解惑 · PostgreSQL 9.6 并行查询实现分析
- MySQL · TokuDB · TokuDB之黑科技工具
- PgSQL · 性能优化 · PostgreSQL TPC-C极限优化玩法
- MariaDB · 版本特性 · MariaDB 的 GTID 介绍
- MySQL · 特性分析 · 线程池
- MySQL · 答疑解惑 · mysqldump tips 两则
- 数据库内核月报 - 2016/01
- MySQL · 引擎特性 · InnoDB 事务锁系统简介
- GPDB · 特性分析· GreenPlum Primary/Mirror 同步机制
- MySQL · 专家投稿 · MySQL5.7 的 JSON 实现
- MySQL · 特性分析 · 优化器 MRR & BKA
- MySQL · 答疑解惑 · 物理备份死锁分析
- MySQL · TokuDB · Cachetable 的工作线程和线程池
- MySQL · 特性分析 · drop table的优化
- MySQL · 答疑解惑 · GTID不一致分析
- PgSQL · 特性分析 · Plan Hint
- MariaDB · 社区动态 · MariaDB on Power8 (下)
- 数据库内核月报 - 2015/12
- MySQL · 引擎特性 · InnoDB 事务子系统介绍
- PgSQL · 特性介绍 · 全文搜索介绍
- MongoDB · 捉虫动态 · Kill Hang问题排查记录
- MySQL · 参数优化 ·RDS MySQL参数调优最佳实践
- PgSQL · 特性分析 · 备库激活过程分析
- MySQL · TokuDB · 让Hot Backup更完美
- PgSQL · 答疑解惑 · 表膨胀
- MySQL · 特性分析 · Index Condition Pushdown (ICP)
- MariaDB · 社区动态 · MariaDB on Power8
- MySQL · 特性分析 · 企业版特性一览
- 数据库内核月报 - 2015/11
- MySQL · 社区见闻 · OOW 2015 总结 MySQL 篇
- MySQL · 特性分析 · Statement Digest
- PgSQL · 答疑解惑 · PostgreSQL 用户组权限管理
- MySQL · 特性分析 · MDL 实现分析
- PgSQL · 特性分析 · full page write 机制
- MySQL · 捉虫动态 · MySQL 外键异常分析
- MySQL · 答疑解惑 · MySQL 优化器 range 的代价计算
- MySQL · 捉虫动态 · ORDER/GROUP BY 导致 mysqld crash
- MySQL · TokuDB · TokuDB 中的行锁
- MySQL · 捉虫动态 · order by limit 造成优化器选择索引错误
- 数据库内核月报 - 2015/10
- MySQL · 引擎特性 · InnoDB 全文索引简介
- MySQL · 特性分析 · 跟踪Metadata lock
- MySQL · 答疑解惑 · 索引过滤性太差引起CPU飙高分析
- PgSQL · 特性分析 · PG主备流复制机制
- MySQL · 捉虫动态 · start slave crash 诊断分析
- MySQL · 捉虫动态 · 删除索引导致表无法打开
- PgSQL · 特性分析 · PostgreSQL Aurora方案与DEMO
- TokuDB · 捉虫动态 · CREATE DATABASE 导致crash问题
- PgSQL · 特性分析 · pg_receivexlog工具解析
- MySQL · 特性分析 · MySQL权限存储与管理
- 数据库内核月报 - 2015/09
- MySQL · 引擎特性 · InnoDB Adaptive hash index介绍
- PgSQL · 特性分析 · clog异步提交一致性、原子操作与fsync
- MySQL · 捉虫动态 · BUG 几例
- PgSQL · 答疑解惑 · 诡异的函数返回值
- MySQL · 捉虫动态 · 建表过程中crash造成重建表失败
- PgSQL · 特性分析 · 谈谈checkpoint的调度
- MySQL · 特性分析 · 5.6 并行复制恢复实现
- MySQL · 备库优化 · relay fetch 备库优化
- MySQL · 特性分析 · 5.6并行复制事件分发机制
- MySQL · TokuDB · 文件目录谈
- 数据库内核月报 - 2015/08
- MySQL · 社区动态 · InnoDB Page Compression
- PgSQL · 答疑解惑 · RDS中的PostgreSQL备库延迟原因分析
- MySQL · 社区动态 · MySQL5.6.26 Release Note解读
- PgSQL · 捉虫动态 · 执行大SQL语句提示无效的内存申请大小
- MySQL · 社区动态 · MariaDB InnoDB表空间碎片整理
- PgSQL · 答疑解惑 · 归档进程cp命令的core文件追查
- MySQL · 答疑解惑 · open file limits
- MySQL · TokuDB · 疯狂的 filenum++
- MySQL · 功能分析 · 5.6 并行复制实现分析
- MySQL · 功能分析 · MySQL表定义缓存
- 数据库内核月报 - 2015/07
- MySQL · 引擎特性 · Innodb change buffer介绍
- MySQL · TokuDB · TokuDB Checkpoint机制
- PgSQL · 特性分析 · 时间线解析
- PgSQL · 功能分析 · PostGIS 在 O2O应用中的优势
- MySQL · 引擎特性 · InnoDB index lock前世今生
- MySQL · 社区动态 · MySQL内存分配支持NUMA
- MySQL · 答疑解惑 · 外键删除bug分析
- MySQL · 引擎特性 · MySQL logical read-ahead
- MySQL · 功能介绍 · binlog拉取速度的控制
- MySQL · 答疑解惑 · 浮点型的显示问题
- 数据库内核月报 - 2015/06
- MySQL · 引擎特性 · InnoDB 崩溃恢复过程
- MySQL · 捉虫动态 · 唯一键约束失效
- MySQL · 捉虫动态 · ALTER IGNORE TABLE导致主备不一致
- MySQL · 答疑解惑 · MySQL Sort 分页
- MySQL · 答疑解惑 · binlog event 中的 error code
- PgSQL · 功能分析 · Listen/Notify 功能
- MySQL · 捉虫动态 · 任性的 normal shutdown
- PgSQL · 追根究底 · WAL日志空间的意外增长
- MySQL · 社区动态 · MariaDB Role 体系
- MySQL · TokuDB · TokuDB数据文件大小计算
- 数据库内核月报 - 2015/05
- MySQL · 引擎特性 · InnoDB redo log漫游
- MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析
- MySQL · 捉虫动态 · 5.6 与 5.5 InnoDB 不兼容导致 crash
- MySQL · 答疑解惑 · InnoDB 预读 VS Oracle 多块读
- PgSQL · 社区动态 · 9.5 新功能BRIN索引
- MySQL · 捉虫动态 · MySQL DDL BUG
- MySQL · 答疑解惑 · set names 都做了什么
- MySQL · 捉虫动态 · 临时表操作导致主备不一致
- TokuDB · 引擎特性 · zstd压缩算法
- MySQL · 答疑解惑 · binlog 位点刷新策略
- 数据库内核月报 - 2015/04
- MySQL · 引擎特性 · InnoDB undo log 漫游
- TokuDB · 产品新闻 · RDS TokuDB小手册
- PgSQL · 社区动态 · 说一说PgSQL 9.4.1中的那些安全补丁
- MySQL · 捉虫动态 · 连接断开导致XA事务丢失
- MySQL · 捉虫动态 · GTID下slave_net_timeout值太小问题
- MySQL · 捉虫动态 · Relay log 中 GTID group 完整性检测
- MySQL · 答疑释惑 · UPDATE交换列单表和多表的区别
- MySQL · 捉虫动态 · 删被引用索引导致crash
- MySQL · 答疑释惑 · GTID下auto_position=0时数据不一致
- 数据库内核月报 - 2015/03
- MySQL · 答疑释惑· 并发Replace into导致的死锁分析
- MySQL · 性能优化· 5.7.6 InnoDB page flush 优化
- MySQL · 捉虫动态· pid file丢失问题分析
- MySQL · 答疑释惑· using filesort VS using temporary
- MySQL · 优化限制· MySQL index_condition_pushdown
- MySQL · 捉虫动态·DROP DATABASE外键约束的GTID BUG
- MySQL · 答疑释惑· lower_case_table_names 使用问题
- PgSQL · 特性分析· Logical Decoding探索
- PgSQL · 特性分析· jsonb类型解析
- TokuDB ·引擎机制· TokuDB线程池
- 数据库内核月报 - 2015/02
- MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
- MySQL · 社区动态· 5.6.23 InnoDB相关Bugfix
- PgSQL · 特性分析· Replication Slot
- PgSQL · 特性分析· pg_prewarm
- MySQL · 答疑释惑· InnoDB丢失自增值
- MySQL · 答疑释惑· 5.5 和 5.6 时间类型兼容问题
- MySQL · 捉虫动态· 变量修改导致binlog错误
- MariaDB · 特性分析· 表/表空间加密
- MariaDB · 特性分析· Per-query variables
- TokuDB · 特性分析· 日志详解
- 数据库内核月报 - 2015/01
- MySQL · 性能优化· Group Commit优化
- MySQL · 新增特性· DDL fast fail
- MySQL · 性能优化· 启用GTID场景的性能问题及优化
- MySQL · 捉虫动态· InnoDB自增列重复值问题
- MySQL · 优化改进· 复制性能改进过程
- MySQL · 谈古论今· key分区算法演变分析
- MySQL · 捉虫动态· mysql client crash一例
- MySQL · 捉虫动态· 设置 gtid_purged 破坏AUTO_POSITION复制协议
- MySQL · 捉虫动态· replicate filter 和 GTID 一起使用的问题
- TokuDB·特性分析· Optimize Table
- 数据库内核月报 - 2014/12
- MySQL· 性能优化·5.7 Innodb事务系统
- MySQL· 踩过的坑·5.6 GTID 和存储引擎那会事
- MySQL· 性能优化·thread pool 原理分析
- MySQL· 性能优化·并行复制外建约束问题
- MySQL· 答疑释惑·binlog event有序性
- MySQL· 答疑释惑·server_id为0的Rotate
- MySQL· 性能优化·Bulk Load for CREATE INDEX
- MySQL· 捉虫动态·Opened tables block read only
- MySQL· 优化改进· GTID启动优化
- TokuDB· Binary Log Group Commit with TokuDB
- 数据库内核月报 - 2014/11
- MySQL· 捉虫动态·OPTIMIZE 不存在的表
- MySQL· 捉虫动态·SIGHUP 导致 binlog 写错
- MySQL· 5.7改进·Recovery改进
- MySQL· 5.7特性·高可用支持
- MySQL· 5.7优化·Metadata Lock子系统的优化
- MySQL· 5.7特性·在线Truncate undo log 表空间
- MySQL· 性能优化·hash_scan 算法的实现解析
- TokuDB· 版本优化· 7.5.0
- TokuDB· 引擎特性· FAST UPDATES
- MariaDB· 性能优化·filesort with small LIMIT optimization
- 数据库内核月报 - 2014/10
- MySQL· 5.7重构·Optimizer Cost Model
- MySQL· 系统限制·text字段数
- MySQL· 捉虫动态·binlog重放失败
- MySQL· 捉虫动态·从库OOM
- MySQL· 捉虫动态·崩溃恢复失败
- MySQL· 功能改进·InnoDB Warmup特性
- MySQL· 文件结构·告别frm文件
- MariaDB· 新鲜特性·ANALYZE statement 语法
- TokuDB· 主备复制·Read Free Replication
- TokuDB· 引擎特性·压缩
- 数据库内核月报 - 2014/09
- MySQL· 捉虫动态·GTID 和 DELAYED
- MySQL· 限制改进·GTID和升级
- MySQL· 捉虫动态·GTID 和 binlog_checksum
- MySQL· 引擎差异·create_time in status
- MySQL· 参数故事·thread_concurrency
- MySQL· 捉虫动态·auto_increment
- MariaDB· 性能优化·Extended Keys
- MariaDB·主备复制·CREATE OR REPLACE
- TokuDB· 参数故事·数据安全和性能
- TokuDB· HA方案·TokuDB热备
- 数据库内核月报 - 2014/08
- MySQL· 参数故事·timed_mutexes
- MySQL· 参数故事·innodb_flush_log_at_trx_commit
- MySQL· 捉虫动态·Count(Distinct) ERROR
- MySQL· 捉虫动态·mysqldump BUFFER OVERFLOW
- MySQL· 捉虫动态·long semaphore waits
- MariaDB·分支特性·支持大于16K的InnoDB Page Size
- MariaDB·分支特性·FusionIO特性支持
- TokuDB· 性能优化·Bulk Fetch
- TokuDB· 数据结构·Fractal-Trees与LSM-Trees对比
- TokuDB·社区八卦·TokuDB团队