1. 增加计算列

在MySQL5.7之前的版本,想要实现计算列的功能,有三种方式:
1)使用触发器,如:

create trigger inst_t before insert/update on t for each row set new.row3 = new.c1 + new.c2;


2)使用视图,如:

create view vw_t as select id,t1,t2,t1+t2 as t3 from t;


3)update方法,如:
udpate t set t3 = t1 + t2;
当然,第三种方法就当作没看见吧。。。

MySQL5.7中增加了计算列,只需要定义一个列为计算列即可,语法:
clo_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE[KEY]] [COMMENT comment][[NOT]NULL][[PRIMARY]KEY]
其中,VIRTUAL 和 STORED 分别指虚拟列和实际的列,虚拟列是不存储在磁盘中的,只在内存中。
如定义c3为计算列:

create table t(id auto_increment not null, c1 int, c2 int, c3 int as (t1 + t2), primary key(id));

这样,insert或者update c1和c2之后,c3的值会自动变化。


2. 引入JSON列类型

在MySQL5.7之前的版本中,如果要使用JSON类型,只能在varchar或者text等字符类型的列中存储JSON类型的字符串,并通过程序解析使用JSON字符串。
MySQL5.7版本中,增加了JSON列类型以及JSON相关处理函数,如json_type(), json_object(), json_merge等。

JSON列类型包括JSON数组和JSON对象两种,数组是以列表的形式存储的,使用json_array函数生成,如:

mysql> select json_array('a','b',now());
+------------------------------------------+
| json_array('a','b',now())                |
+------------------------------------------+
| ["a", "b", "2016-01-23 22:30:11.000000"] |
+------------------------------------------+
1 row in set (0.03 sec)

JSON对象是以字典(键值对)形式存储的,使用json_object()函数生成,如:

mysql> select json_object('key1',1,'key2','hello');
+--------------------------------------+
| json_object('key1',1,'key2','hello') |
+--------------------------------------+
| {"key1": 1, "key2": "hello"}         |
+--------------------------------------+
1 row in set (0.00 sec)

来个例子:

mysql> create table json_t(t1 json);
Query OK, 0 rows affected (0.09 sec)

mysql> show create table json_t;
+--------+---------------------------------------------+
| Table  | Create Table                                |                                            
+--------+---------------------------------------------+
| json_t | CREATE TABLE `json_t` (
  `t1` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+---------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into json_t(t1) values(json_array('a','b',1,2));
Query OK, 1 row affected (0.01 sec)

mysql> select * from json_t;
+------------------+
| t1               |
+------------------+
| ["a", "b", 1, 2] |
+------------------+
1 row in set (0.01 sec)

mysql> insert into json_t(t1) values(json_object('key1','aa','key2',10));
Query OK, 1 row affected (0.04 sec)

mysql> select * from json_t;
+----------------------------+
| t1                         |
+----------------------------+
| ["a", "b", 1, 2]           |
| {"key1": "aa", "key2": 10} |
+----------------------------+
2 rows in set (0.00 sec)

3. 基于表的多线程复制

MySQL5.6版本开始支持多线程复制,只不过对于每一个库一个复制线程。
MySQL5.7版本开始对多线程的复制功能进行了加强,增加了slave_parallel_type参数来控制并发同步是基于database还是logical_clock
MySQL5.7同时增加了对在线变更复制方式的支持,把基于日志点的复制方式变为基于gtid的复制方式,或者把gtid的复制方式转变为基于日志点的复制方式,在MySQL5.7之前的版本中都需要重启master服务器,MySQL5.7不需要重启。

在线变更复制方式:

1. SET @@GLOBAL.ENFORCE_GRID_CONSISTENCY = WARN; 
 执行完这一步后,要保证所有服务器都没有警告发生,有的话要查看警告原因。 
 2. SET @@GLOBAL.ENFORCE_GRID_CONSISTENCY = ON; 
 3. SET @@GLOBAL.GRID_MODE = OFF_PERMISSIVE; 
 4. SET @@GLOBAL.GRID_MODE = ON_PERMISSIVE; 
 5. SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT’; 
 6. SET @@GLOBAL.GRID_MODE = ON; 并把gtid-mode=on 加入到my.cnf配置文件中。 
 7. STOP SLAVE [FOR CHANNEL ‘channel’]; 
 CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL ‘channel’]; 
 START SLAVE [FOR CHANNEL ‘channel’];

4. InnoDB引擎增强

支持缓冲池大小在线改变。
增加innodb_buffer_pool导入导出功能。
支持为innodb表建立公用表空间。


5.安全管理方面的增强

不再支持old_password认证。
增加账号默认过期时间及加强了账号的管理功能。
show variables like ‘default_password_lifetime’;
可以看到账号默认过期时间为360天,为了避免修改密码的麻烦,可以设置为0。
可以对账号进行锁定和解锁。
增加了sys管理数据库。sys数据库中的表都是依赖于performance_schema数据库中的表的视图。