目前最新MySQL5.7
11/03, 2014 MySQL GeirHoydalsvik
最近我们发布了5.7.5里程碑版本,也是我们通向5.7 GA路上的又一里程碑。发放里程碑版本的是为了更好地了解社区回复以保证5.7版的优秀品质。这篇帖子会介绍目前对于5.7版的更深见解,同时也能让读者对我们的产品有一个宏观的认识。您可以再里程碑系列博客(5.7.1,5.7.2, 5.7.3, 5.7.4, 5.7.5)以及单独的细节作品和实施细节博客中了解更多信息。当然也可以直接到github.com/mysql了解我们的源代码。
MySQL目前拥有史上最强开发团队,已发表244篇工作记录,同时添加497个MTR测试,修复共计1263个程序漏洞(仅5.7版)。假如数据听上去太过笼统泛泛,那么这篇指南想必会十分有用。注:我们之前发布的许多产品特点就不在此一一赘述了,这次主要谈关于5.7版的种种。其他信息概括可以见此处(链接就不加了里面也都是英文内容)。那么,现在让我们揭开5.7版的帷幕。
Performance & Scalability
性能及伸缩性
通过了解圈内评论,考虑当下电脑硬件及构造的发展潮流,MySQL的首要任务是做好性能和伸缩性。目前我们的5.7版不仅因InnoDB大大提高了读写可伸缩性,我们还加速了其服务器层的连接处理速度。同时我们也没忘记不断升级InnoDB的读写伸缩性,加快刷新清扫速读(也可能是冲刷流水线那个冲刷速度吧,译者不懂这块就来翻译给读者道歉了),以及大批量数据的读取速度。
我们已经提高了InnoDB只读伸缩性能和主读模式(read-mostly以读为主)工作性能。并且大大增强了InnoDB处理只读事务(WL#6047, WL#6899, WL#6906, WL#6578 [都是链接大概是细节介绍什么的真有需要再加链接吧太多])的能力。我们还解决了因元数据锁(MDL)引起的服务器层争用问题,移除了InnoDB的“螺纹锁(线程锁)”(thd_locks) (WL#7304, WL#7305, WL#7306, WL#6671)。见DimitriKravtchuk的文章“ MySQL性能:MySQL 5.7达到500K QPS(MySQL Performance:reaching 500K QPS with MySQL 5.7其实个人觉得译成MySQL带你飞更好)”,“MySQL 5.7 : InnoDB的Memcached插件可超过1M QPS(MySQL 5.7 : Over 1M QPSwith InnoDB Memcached Plugin)”和SunnyBains的文章“ 5.7.3中事务处理寿命周期的提高(Transactionlife cycle improvements in 5.7.3)”,还有JimmyYang的“MySQL 5.7.3: InnoDB Memcached直达1milQPS(MySQL 5.7.3: Deep dive into 1mil QPS with InnoDBMemcached)”。
通过移除“索引锁争用”,我们还提高了其读写处理能力。我们曾经用来保护整个索引树结构的索引锁现在已被更好的“块锁”替代。见Yasufumi Kinoshita的文章“MySQL-5.7提高DML方向的作业负荷(MySQL-5.7improves DML oriented workloads)”。
InnoDB的快速平行冲刷(刷新)方面,我们减少了在刷新表单组时的扫描页数,从而加速了单页的刷新,同时扫描的时间复杂度从O(n*n) 减少到了 O(n)。我们还通过加入多页清理线程实现了平行刷新。这帮助我们更大的提升了多核系统的伸缩性和吞吐量,并避免了刷新瓶颈。
加速连接处理:在一些应用脚本(例如PHP applications)中代理连接寿命十分短暂,基本只能执行一次单独询问(query)。这意味着连接与断开的处理时间对整体性能有极大影响。在5.7版中我们卸掉了线程初始化和网路初始化转成一个背景工作线程,同时将MySQL的高频连接/断开周期从26K每秒加倍提高到56K每秒。可见于JonOlav Hauglid的文章“提高连接/断开性能(Improving connect/disconnect performance)”。
批量数据读取的提高:定义索引的批量读取实现了索引分类创建,从而是定义索引操作更加快速。在此之前,InnoDB通过基本表做循环,为每个基本表的数据在索引表中建立单独记录。有了这个技术,InnoDB可以从基本表读取大量数据并用索引键分类数据,然后将整行的数据块插入基本表。