安全的提升
1.1 在Mysql 8版本中,caching_sha2_password 是一个缺省的认证插见.5.7 版本的客户端支持 caching_sha2_password 的客户端认证。
1.2 用户表mysql.user要求plugin字段非空,且默认值是mysql_native_password,并且不再支持mysql_old_password
1.3 增加了密码过期特性。
1.4 管理员可以对普通用户加锁/解锁来控制用户的访问权限
1.5 为更容易支持安全连接,使用OpenSSL编译的MySQL服务器可以在启动时自动生成SSL和RSA证书以及密钥文件
1.6 使用 mysqld --initialize 代替 mysql_install_db 对数据库进行初始化。
a 只创建一个 root账号,并且生成一个临时的标记为过期密码
b 不创建其他账号
c 不创建test 数据库
SQL mode的变换
2.1 默认的SQL_MODE:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION.
a 语句:SELECT deptno,ename,max(sal) FROM emp GROUP BY deptno; 在mysql5.6中可以正常执行,但在mysql5.7中会报语义异常。观察发现:ename 即不在聚集函数中,也没有出现在group by list中。对于语义限制比较严谨的数据库,如Oracle是不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,这也是SQL92的标准。所以从MySQL 5.7版本开始修正了这个语义,就是我们所说的ONLY_FULL_GROUP_BY语义。
b STRICT_TRANS_TABLES 是说要存储的字段的长度大于字段定义的大小,直接报错而非像5.6版本以及之前,截断数据进行存储,同时抛出一个warning
2.2 online ddl 支持 rename index name。更改是以 in place方式进行的,不会伴随table-copy的操作。
2.3 新增内置的full text 插件,支持中文 ,韩文,日文全文索引
InnoDB 功能的增强
3.1 以 in-place 方式动态修改 varchar 长度大小。但存在限制,即表示 varchar 列长的字节不能变化。(专门存在一或两个字节记录 varchar 列的长度。varchar列的长度在0-255字节长度时,只需要一个字节记录 varchar 列的长度;varchar列的长度超过255字节长度时,需要两个字节记录 varchar 列的长度。)如果字段的长度从254增到256时就不能使用in-place算法,必须使用copy算法,否侧报错.需要注意的是 减小 varchar(N)长度的大小必须使用copy类型。
3.2 临时表
通过对CREATE TABLE, DROP TABLE, TRUNCATE TABLE, and ALTER TABLE 语句的优化, 提升了涉及临时表的DDL语句的性能。
临时表的元数据信息不再存储 InnoDB 系统表中,而是记录到新表 INNODB_TEMP_TABLE_INFO中。
3.3 临时表空间
新增一个独立的表空间用来存储非压缩的临时表。Mysql启动时,这个临时表空间会被自动创建。可以通过innodb_temp_data_file_path定义临时表空间的路径。
3.4 新增临时表的undo日志
针对临时表及相关对象引入新的 non-redo undo log,存放在临时表空间。该类型的undo log非 redolog, 因为临时表在数据库崩溃后不需要恢复,也就无需redo logs,避免了写relog相关的io,从而提高了性能。
3.5 新增空间类型 DATA_GEOMETRY
InnoDB 现在支持 MySQL-supported 空间数据库类型。之前版本,InnoDB使用binary BLOB 类型存储空间类型数据。现在空间数据类型被映射到了一个InnoDB内部数据类型DATA_GEOMETRY.
3.6 innochecksum 功能被提升
innochecksum--离线的InnoDB文件校验工具,新增了新的选择项和扩展的功能
3.7 对Fusion-io NVM 文件系统的优化
Linux系统中Fusion-io Non-Volatile Memory (NVM)文件系统提供了原子写能力,使InnoDB的doublewrite变得冗余。
因此,如果Fusion-io设备支持原子写, MySQL系统会自动关闭doublewrite,减少IO,提升性能。
3.8 支持移动表空间 Transportable Tablespace
简化了分区表的备份过程,并支持在MySQL实例之间复制分区表和单个表分区。
3.9 支持动态调整 innodb_buffer_pool_size
支持在不重启系统的情况下动态调整innodb_buffer_pool_size。resize的过程是以chunk为单位迁移pages到新的内存空间。
chunk的大小可通过innodb_buffer_pool_chunk_size配置。
迁移进度可以通过Innodb_buffer_pool_resize_status 查看。
3.10 InnoDB在创建或重建索引时执行批量加载。这种创建索引的方法称为“sorted index build”。这种增强也适用于全文索引,它提高了索引创建的效率。在排序索引构建期间,innodb_fill_factor定义了每个页面上的空间百分比是用来填充数据的,剩余空间预留给未来索引增长
3.11 新增一个新的日志记录类型(MLOG_FILE_NAME)用于标识自上次检查点以来被修改的表空间。这个增强简化了表空间的恢复。
3.12 支持truncate undo logs,相关启用参数 innodb_undo_log_truncate
3.13 支持本地分区。在之前版本中,InnoDB 依赖 ha_partition handler,它会为每一个分区创建一个 handler 对象。对于本地分区,InnoDB分区表只是用一个单独的 partition-aware handler 对象。这样的分区表功能增强节约分区表使用的内存。
3.14 支持 General Tablespaces。可以在MySQL数据目录之外创建,能够容纳多个表,支持所有行格式的表
3.15 InnoDB表的隐式默认行格式为DYNAMIC。相关参数 innodb_default_row_format
3.16 MySQL 5.7.11 开始,InnoDB支持file-per-table表空间的静态数据加密
支持JSON类型
MySQL 5.7.8开始支持本地化JSON类型。JSON值不是以string类型存储的,而是以内部的binary格式存储,有利于快速读取。
MySQL 5.7.8开始提供了一些与JSON相关的函数:
Functions that create JSON values: JSON_ARRAY(), JSON_MERGE(), and JSON_OBJECT().
Functions that search JSON values: JSON_CONTAINS(), JSON_CONTAINS_PATH(), JSON_EXTRACT(), JSON_KEYS(), and JSON_SEARCH().
Functions that modify JSON values: JSON_APPEND(), JSON_ARRAY_APPEND(), JSON_ARRAY_INSERT(), JSON_INSERT(), JSON_QUOTE(), JSON_REMOVE(), JSON_REPLACE(), JSON_SET(), and JSON_UNQUOTE().
Functions that provide information about JSON values: JSON_DEPTH(), JSON_LENGTH(), JSON_TYPE(), and JSON_VALID().
sys schema
MySQL 5.7 新增加了sys schema,sys schema方便性能调优和问题定位。
Optimizer
EXPLAIN 可以通过指定会话id 获取该会话执行sql的执行计划。
增强了hint的功能
Triggers
Mysql 5.7之前版本,对于触发器事件(INSERT, UPDATE, DELETE)和操作时间(BEFORE, AFTER)的组合,表最多只能有一个触发器。这个限制已经解除,允许多个触发器。
Logging
Mysql 5.7之前版本,在Unix和类Unix系统上,MySQL将错误日志发送到syslog是通过mysqld_safe捕获错误输出然后传递到syslog来实现的。新的版本支持将错误日志输出到syslog,且适用于windows系统,只需要通过简单的参数(log_syslog等)配置即可
Mysql客户端现在有一参数--syslog ,该参数可将在交互式模式下执行过的命令输出到syslog中。对于匹配“ignore”过滤规则(可通过 –histignore选项或者 MYSQL_HISTIGNORE环境变量进行设置)的语句不会被记入
Generated Columns
在MySQL 5.7中,支持两种Generated Column,
1 Virtual Generated Column :只将Generated Column保存在数据字典中表的元数据,每次读取该列时进行计算,并不会将这一列数据持久化到磁盘上;
注意:MySQL 5.7.8 以前 虚拟列字段不支持创建索引。5.7.8之后Innodb支持在虚拟列创建辅助索引。
2 Stored Generated Column : 将Column持久化到存储,会占用一定的存储空间。与Virtual Column相比并没有明显的优势,因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。
Index condition pushdown support for partitioned tables
在MySQL 5.7中,分区表也开始支持ICP特性
Master dump thread improvements
在MySQL 5.7.2之前,转储线程在每次读取事件时都对二进制日志进行锁定;在MySQL 5.7.2或更高版本中,只有在最后一次成功写入事件结束时读取位置时才持有此锁。