原文:http://chuansong.me/n/1979661
编辑
闫丽慧@SAP(内容收集&文章整理)
董 伟、萧田国(审核&发布)
精彩观点先知道
- 引入事务池,所有事务缺省是只读,直到开始写操作,才成为读写事务;
- Innodb_buffer_pool_size可动态调整
- 新增Memcached插件,适合数据量很小、但访问非常频繁的只读操作;
- 新增虚拟列和虚拟列索引,新的数据压缩和GIS等功能;
- 优化临时表机制,以提高复杂查询的性能。
1. 性能提升
1.1 事务操作相关优化
- 创建事务池(Transaction Pool),这样就能减少很多事务创建和释放的开销
- 优化了事务的生命周期管理,所有事务首先都默认为是只读事务,这样这些事务就不会和其他事务冲突,只有当此事务开始一个写操作时才认为它是一个读写事务。
- 对事务的优先级也做了一些调整
性能提升:
- 对于只读事务,5.7比5.6有超过一倍的性能提升
- 对于读写事务,也有50%左右的性能提升
1.2 临时表相关优化
我们将临时表从数据字典中分离出来,这样,临时表就不会跟其他正常表争抢数据字典的锁。同时,我们还将临时表的表空间跟普通表空间区别开来,以减少IO的开销
对于临时表的DML操作,我们只记录Undo日志,不记录Redo日志
如果查询有join,基本上都要用到临时表的这项优化。
1.3 其他性能优化
- 缓冲区优化:解决在12核甚至更多核机器上性能问题;另外,缓冲区刷新到磁盘也可以多线程做了
- Memcached插件性能提升:得益于只读事务的优化,InnoDB的Memcached 插件也有了性能的飞跃,现在已经可以达到1.1M QPS
- 更快的DDL:这里主要指的是Alter table增加索引之类的操作。原来建索引是读一行插一行,现在是读一批,排序再批量插入。
2. 新功能介绍
2.1 分区功能
以前,InnoDB内部是没有分区的,大家看到的都是在InnoDB外面做的分区。而现在,InnoDB原生支持了分区。
5.7提供了对一个单独的分区做import/export操作的支持
2.2 表空间管理
CREATE TABLESPACE Logs ADD DATAFILE 'log01.ibd';
CREATE TABLE http_req(c1 varchar) TABLESPACE=Logs;
ALTER TABLE some_table TABLESPACE=Logs;
DROP TABLESPACE Logs; - must be empty
其实这个不是什么新功能,只是让大家以更为习惯的方式来管理表空间而已。
2.3 缓冲区动态调整
大家再也不用关数据库,改配置文件,再启动数据库来修改缓冲区的大小了,
2.4 日志管理的新功能
日志管理的新功能是自动截断,这样日志文件就不会再不停的增长了。
2.5 支持更大的数据页
之前支持的是4k,8k,16k,现在可以支持32k,64k了。这样一些blob数据就可以直接存在页里,访问起来更快
2.6 GIS的支持
在5.7中最重要的新功能是对GIS的支持。在InnoDB内部实现了基于R-tree的空间索引,这样用户就能很方便的查找地理信息数据了。例如:
查找以我为中心,周围2公里范围内的妹子之类的操作将变得异常迅速。
2.7 虚拟列和虚拟列上的索引
5.7中还有一个重要功能是虚拟列和虚拟列上的索引。也就是对于那些可以通过其他列的数据计算出来的列,大家可以创建一个虚拟列,它实际上是不存储数据的,每次读这个列都是临时在InnoDB内部计算出来。
2.8 新的数据压缩方法
另一个重要的新功能是新的数据压缩方法。基于页IO的压缩,也就是说,数据的压缩和解压发生在页IO的过程中。
利用了一些文件系统的Punch Hole(文件打洞)功能来辅助实现这一新功能。
效果:文件更小,效率更高
2.9 其他新功能
- 增加了一些字符集的支持,比如GB18030
- 更完善的全文索引支持
- 对于新存储设备的支持方面,在5.7中支持了原子写入,在NVMFS上关掉了DW buffer
- PFS:对于运维来说应该有帮助,可以让DBA更多的了解当前系统的状态。
一些常用网站:
3. 总结
InnoDB在5.7中在性能和功能方面做了很多工作