MySQL5.7中InnoDB不可不知的新特性

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MySQL5.7中InnoDB不可不知的新特性

一、性能提升

首先,是性能方面。在5.7中,我的老板(大牛)做了一个很重要的工作,就是对InnoDB的事务(transaction)进行了优化。

1、事务优化

在这方面他做的第一件事情就是创建事务池(Transaction Pool),这样就能减少很多事务创建和释放的开销。

他做的第二件事情就是优化了事务的生命周期管理。所有事务首先都默认为是只读事务,这样这些事务就不会和其他事务冲突,只有当此事务开始一个写操作时才认为它是一个读写事务。

另外,对事务的优先级也有了一些调整。

接下来我们看看经过这些修改之后,性能有些什么变化。

图上我们可以看到对于单点查询,sysbench oltp测试中,5.7可以达到1.6MQPS,比5.6有接近3倍的性能提升!对于只读事务,我们用sysbench oltp测试下,5.7比5.6有超过一倍的性能提升!

对于只读事务,我们用sysbench oltp测试下,5.7比5.6有超过一倍的性能提升!

而对于读写事务,我们也有50%左右的性能提升。是不是很强劲?当然,这只是其中一项性能优化,接下来还有更精彩的。

2、临时表优化

我们在5.7中另一项重大性能优化是对临时表达优化。

在5.7中,我们将临时表从数据字典中分离出来,这样,临时表就不会跟其它正常表争抢数据字典的锁。同时,我们还将临时表的表空间跟普通表空间区别开来,以减少I/O的开销。

对于临时表的DML操作,我们只记录Undo日志,不记录Redo日志,因为,临时表不需要在Crash的时候Recovery,但是它需要rollback。这样也减少了大量的日志开销。

这张图显示了5.7的临时表create和drop的性能提升,这个应该是重复几万次create和drop所耗费的时间。5.7快到飞起来!

这是对临时表插入5M行当数据的测试,一倍以上的提升。

这是删除,开销减少了75%左右。

update,减少40%左右。所以,如果大家在应用中会使用InnoDB的临时表,那这个优化就能带来很大的好处。

刚才谈到的这个优化实际上不光是对InnoDB的临时表有用,还对一种大家平时看不见的表,优化器用的缓存表也有好处。之前,MySQL的优化器是用MyISAM来缓存SQL执行的中间结果集的, 现在,采用了InnoDB优化后的临时表,大家可以看图,明显快多了嘛!

好了,介绍完两个最大头的性能优化点,接下来我们浏览一下其他一些也非常重要的性能优化工作。

3、其他性能优化工作

缓冲区

这个是对于缓冲区的优化,页的reference count采用了原子操作,可以极大的提高这个计数器的操作效率。可以看到,这个优化最重要的是解决在12核甚至更多核机器上性能问题。

同时,也对原来的刷写算法做了优化,提升了刷写效率。

缓冲区刷写采用多线程,而且可以配置线程数,同样能提高刷写效率。

Redo日志的I/O

对于Redo 日志的I/O,我们不仅解决了一些bug而且还优化了checksum以及mutex的算法。

Memcached 插件

得益于前面介绍的只读事务的优化,InnoDB的Memcached 插件也有了性能的飞跃,现在已经可以达到1.1M QPS。建议大家尝试一下,特别是对数据量很小, 但访问非常频繁的只读操作,可以采用InnoDB的Memcached插件。

这是memcached的测试结果,性能大幅提升。

索引上的锁

这项优化是针对索引上的锁,一个非常复杂但是值得的优化。

DDL和truncate的优化

对于DDL和truncate的优化,现在truncate可以做到原子操作了,之前truncate中如果crash了,会导致出错。alter table也支持了更多新操作。

更快的DDL,这里主要指的是Alter table增加索引之类的操作。原来建索引是读一行插一行,现在是读一批,排序再批量插入。所以,性能有了170%的提升。

呵呵,这下,大家增加一个索引就快多了。

AHI

对于AHI的优化主要是将原来的哈希索引拆分成多个。

对于性能的优化这一部分就介绍到这里,总结一下,就是InnoDB在5.7中对性能做了一些非常重大的优化, 不光可以大幅加速数据的访问和存储的速度, 还能让大家节省很多日常维护的时间。

接下来,再讲讲我们在5.7中增加了哪些新功能。

二、新功能

1、分区功能

首先是分区功能。以前,InnoDB内部是没有分区的,大家看到的都是在InnoDB外面做的分区。而现在,InnoDB原生支持了分区。

这样带来的好处是,减少了内存开销。以这样一个8k的分区的表为例,当打开十个实例的时候,可以减少90%的内存开销。

而且现在我们还可以对一个单独的分区做import/export了。

对于分区也支持了ICP和使用HANDLER来访问了。

2、表空间管理

接下来一个新功能是表空间管理。其实这个不是什么新功能,只是让大家以更为习惯的方式来管理表空间。

3、动态调整缓冲区的大小

再接下来这个功能,我想大家肯定会喜欢,就是动态调整缓冲区的大小。

大家再也不用关数据库,改配置文件,再启动数据库来修改缓冲区的大小了,so easy!

4、日志管理

日志管理的新功能是自动截断,这样日志文件就不会再不停的增长了。这个功能我想大家也应该挺喜欢。

5、数据页

支持更大的数据页。之前我们支持的是4k,8k,16k,现在可以支持32k,64k了。这样一些blob数据就可以直接存在页里,访问起来更快。

6、对GIS的支持

在5.7中最大头的新功能是对GIS的支持,主要由同事Jimmy和我来完成。

我们在InnoDB内部实现了基于R-tree的空间索引,这样用户就能很方便的查找地理信息数据了。

相关文档
最新文档