文章来源:慕课网-MySQL5.7版本新特性
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数据库中的表的视图。