读书笔记——

【技术博客】MySQL 5.7 InnoDB新特性图文详解(分享实录)

作者:赖铮 高效运维

原文:http://chuansong.me/n/1979661

编辑

闫丽慧@SAP(内容收集&文章整理)

董 伟、萧田国(审核&发布)

精彩观点先知道

  1. 引入事务池,所有事务缺省是只读,直到开始写操作,才成为读写事务;
  2. Innodb_buffer_pool_size可动态调整
  3. 新增Memcached插件,适合数据量很小、但访问非常频繁的只读操作;
  4. 新增虚拟列和虚拟列索引,新的数据压缩和GIS等功能;
  5. 优化临时表机制,以提高复杂查询的性能。

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中在性能和功能方面做了很多工作