1.9:多线程脏页刷写
innodb_page_cleaners,表示刷写BP脏页的线程数,5.6.2开始从master线程中独立出来,5.7.4之后开始支持多线程flush,默认是4。这个值必须小于等于innodb_buffer_pool_instances,提高CPU的利用率。
1.10:终止会话ctrl+c
在linux下,我们经常使用ctrl+c来终止一个命令的运行,在MySQL 5.7 之前,如果用户输入了错误的SQL语句,按下ctrl+c,虽然能够"结束"SQL语句的运行,但是,也会退出当前会话,MySQL 5.7对这一违反直觉的地方进行了改进,不再退出会话。
1.11:临时表性能的优化
MYSQL5.7为了提高临时表相关的性能,对临时表相关的部分进行了大幅修改,包括引入新的临时表空间(ibtmp1);对于临时表的DDL,不持久化相关表定义;对于临时表的DML,不写redo,关闭change buffer等。
InnoDB临时表元数据不再存储于InnoDB系统表而是存储在INNODB_TEMP_TABLE_INFO,包含所有用户和系统创建的临时表信息。该表在第一次在其上运行select时被创建:
mysql> select * frominformation_schema.innodb_temp_table_info;
Emptyset (0.00sec)
mysql> usedba_test
mysql> create temporary table temp_1(id int,name varchar(100))defaultcharset utf8;
Query OK,0 rows affected (0.00sec)
mysql> select * frominformation_schema.innodb_temp_table_info;+----------+--------------+--------+-------+----------------------+---------------+
| TABLE_ID | NAME | N_COLS | SPACE | PER_TABLE_TABLESPACE | IS_COMPRESSED |
+----------+--------------+--------+-------+----------------------+---------------+
| 42 | #sql1883_8_0 | 5 | 27 | FALSE | FALSE |
+----------+--------------+--------+-------+----------------------+---------------+
1 row in set (0.00 sec)
并且MySQL5.7使用了独立的临时表空间来存储临时表数据,但不能是压缩表。临时表空间在实例启动的时候进行创建,shutdown的时候进行删除。即为所有非压缩的innodb临时表提供一个独立的表空间,默认的临时表空间文件为ibtmp1,位于数据目录。我们可通过innodb_temp_data_file_path参数指定临时表空间的路径和大小,默认12M。只有重启实例才能回收临时表空间文件ibtmp1的大小。create temporary table和using temporary table将共用这个临时表空间。
mysql >show variables like 'innodb_temp_data_file_path';+----------------------------+-----------------------+
| Variable_name | Value |
+----------------------------+-----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
+----------------------------+-----------------------+
物理文件:
# ls -lh ibtmp1-rw-r----- 1 mysql mysql 12M 7月 12 15:13 ibtmp1
mysql> create temporary table temp_1(id int,name varchar(100))default character setutf8;
Query OK,0 rows affected (0.01sec)
mysql> insert into temp_1 select * fromttt;
Query OK,2752512 rows affected (7.10sec)
Records:2752512 Duplicates: 0 Warnings: 0# ls-lh ibtmp1-rw-r----- 1 mysql mysql 204M 7月 12 15:16 ibtmp1 #重启才能回收
在MySQL5.7中,临时表在连接断开或者数据库实例关闭的时候,会进行删除,也就无需redo logs,避免了写relog相关的io,从而提高了性能。只有临时表的metadata使用了redo保护,保护元数据的完整性,以便异常启动后进行清理工作。临时表的元数据5.7之后使用了一个独立的表(innodb_temp_table_info)进行保存,这样就不要使用redo保护,元数据也只保存在内存中。但这有一个前提,必须使用共享的临时表空间,如果使用file-per-table,仍然需要持久化元数据,以便异常恢复清理。临时表需要undo log,用于MySQL运行时的回滚、MVCC等。具体的可以看官方文档和
注意:从5.7.5开始,新增一个系统选项internal_tmp_disk_storage_engine可定义磁盘临时表的引擎类型,默认为InnoDB,可选MyISAM。而在这以前,只能使用MyISAM。而在5.6.3以后新增的参数default_tmp_storage_engine是控制create temporary table创建的临时表的存储引擎,在以前默认是MEMORY。
mysql> show variables like '%engine%';+----------------------------------+--------+
| Variable_name | Value |
+----------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| enforce_storage_engine | |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
1.12:离线的InnoDB文件校验工具功能增强,可以查看ibd文件。新增选择项或扩展的功能:
1.支持使用指定校验算法;2.支持只重写校验值而不进行验证;3.可指定允许的校验和不匹配量;4.显示各类页的个数、导出页类型信息、输出至日志、从标准输入读取数据等;5.从5.7.2起可支持校验超过2G的文件;
innochecksum --help。使用时需要停止mysql服务,或则把ibd文件复制出来,否则会报错:
# innochecksum --page-type-summary ibdata1
Error: Unable to lock file:: ibdata1
fcntl: Resource temporarily unavailable
关闭数据库或则复制出ibd文件执行:
# innochecksum --page-type-summary /tmp/ibdata1
File::/tmp/ibdata1================PAGE TYPE SUMMARY==============#PAGE_COUNT PAGE_TYPE===============================================
13 Indexpage #索引页2820 Undo logpage #undo页2Inode page0 Insertbuffer free list page #插入缓存空闲页1928Freshly allocated page #可用页1 Insertbuffer bitmap #插入缓存位图页98System page #系统页1 Transactionsystem page1 File SpaceHeader0Extent descriptor page0BLOB page0Compressed BLOB page0 Other type ofpage===============================================Additional information:
Undo page type:2806 insert, 14 update, 0other
Undo page state:0 active