天天看点

【MySQL】5.7新特性之三

写在前面

3.1 动态修改varchar 长度大小。

  可以可以通过ALTER TABLE 语句以in place方式修改varchar的大小且无需table-copy。但存在限制:表示varchar 长度的字节数不能变化(如果变更前使用1个字节表示长度,变更后也必须使用1个字节表示),即只支持0~255内的或者255以上的范围变更(增大),如果字段的长度从254增到256时就不能使用in-place算法,必须使用copy算法,否侧报错.需要注意的是 减小 varchar(N)长度的大小必须使用copy类型,如:

mysql> alter table yy change column name name varchar(256) ,algorithm=inplace;

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

mysql> alter table yy change column name name varchar(255) ,algorithm=inplace;

Query OK, 0 rows affected (0.05 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table yy change column name name varchar(256) ,algorithm=copy;

Query OK, 1 row affected (0.10 sec)

Records: 1 Duplicates: 0 Warnings: 0

mysql> alter table yy change column name name varchar(100) ,algorithm=inplace;

3.2 临时表性能优化 

MySQL 5.7对临时表做了极大的改动,提升性能。

通过优化 CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE 语句的执行逻辑,提升临时表的性能。(这个是从官网翻译的,还没找到除了alter之外的其他资料说明详细的优化过程)

InnoDB临时表元数据不再存储于InnoDB系统表而是存储在INNODB_TEMP_TABLE_INFO,包含所有用户和系统创建的临时表信息。该表在第一次在其上运行select时被创建。

mysql> desc information_schema.INNODB_TEMP_TABLE_INFO;

+----------------------+---------------------+------+-----+---------+-------+

| Field                | Type                | Null | Key | Default | Extra |

| TABLE_ID             | bigint(21) unsigned | NO   |     | 0       |       |

| NAME                 | varchar(202)        | YES  |     | NULL    |       |

| N_COLS               | int(11) unsigned    | NO   |     | 0       |       |

| SPACE                | int(11) unsigned    | NO   |     | 0       |       |

| PER_TABLE_TABLESPACE | varchar(64)         | YES  |     | NULL    |       |

| IS_COMPRESSED        | varchar(64)         | YES  |     | NULL    |       |

6 rows in set (0.00 sec)

 为所有 非压缩的innodb临时表提供一个独立的表空间,默认的临时表空间文件为ibtmp1,位于数据目录。我们可通过innodb_temp_data_file_path参数指定临时表空间的路径和大小。

mysql> show global variables like 'innodb_temp_data_file_path';

+----------------------------+-----------------------+

| Variable_name              | Value                 |

| innodb_temp_data_file_path | ibtmp1:12M:autoextend |

1 row in set (0.00 sec)

MySQL每次重新启动时,会重新创建临时表空间。

注意 从5.7.5开始,新增一个系统选项 internal_tmp_disk_storage_engine 可定义磁盘临时表的引擎类型为 InnoDB,而在这以前,只能使用 MyISAM。而在5.6.3以后新增的参数default_tmp_storage_engine是控制create temporary table创建的临时表的存储引擎,在以前默认是MEMORY,不要把这二者混淆了。

mysql> show global variables like '%storage_engine%';

+----------------------------------+--------+

| Variable_name                    | Value |

| default_storage_engine           | InnoDB |

| default_tmp_storage_engine       | InnoDB |

| disabled_storage_engines         |        |

| internal_tmp_disk_storage_engine | InnoDB |

从MySQL 5.7.2 针对临时表及相关对象引入新的"non-redo" undo log,存放于临时表空间。该类型的undo log非 redolog, 因为临时表在数据库崩溃后不需要恢复,也就无需redo logs,避免了写relog相关的io,从而提高了性能。必须指出出操作临时表需要 undo log用于MySQL运行时的回滚、MVCC等。

3.5 支持新的DATA_GEOMETRY空间类型的数据

InnoDB现在支持MySQL-supported空间数据类型。也即,之前的空间数据是以binary BLOB数据存储的,现在空间数据类型被映射到了一个InnoDB内部数据类型DATA_GEOMETRY.

3.6 升级innochecksum

3.7 online DDL语句重建普通表和分区表

  OPTIMIZE TABLE、ALTER TABLE … FORCE、ALTER TABLE … ENGINE=INNODB等操作支持支持使用inplace算法。减少了重建时间和对应用的影响。

3.8 针对Fusion-io NVM 文件系统的优化

   Linux系统中Fusion-io Non-Volatile Memory (NVM)文件系统提供了原子写能力,使InnoDB的doublewrite变得冗余。因此,MySQL5.7.4以后,如果Fusion-io设备支持原子写, MySQL系统会自动关闭doublewrite,减少IO,提升性能。

小结 

   其实关于innodb的新特性和新功能 一篇远远不够,下一篇继续介绍关于 5.7 innodb  相关的知识。