mysql5.7新特性探究


一、MySql5.7增加的特性

1、MySql服務方面新特性

1) 初始化方式改變

  • MySql5.7之前版本初始化方式:
scripts/mysql_install_db
  • MySql5.7版本初始化方式:
[root@darren mysql_new]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql_new/ --datadir=/usr/local/mysql_new/data/

2015-10-10T06:19:06.463455Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-10-10T06:19:10.230200Z 0 [Warning] InnoDB: New log files created, LSN=45790
2015-10-10T06:19:10.766701Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2015-10-10T06:19:10.972179Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: d21c9212-6f16-11e5-8cb9-000c296da6f8.
2015-10-10T06:19:10.979028Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2015-10-10T06:19:10.982274Z 1 [Note] A temporary password is generated for root@localhost: u=SwU?ClN9fR

初始化完成后為root@localhost用戶提供一個默認密碼,5.7版本之前密碼是空的,還是為安全考慮。

第一次進入mysql命令行,強制修改密碼,否則你無法進行任何操作:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> select user,host,password from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> create table t1(id int auto_increment not null,c1 int ,c2 int ,c3 int primary key(id));
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> create database tt;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user root@localhost identified by "root";
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

mysql5.7版本中還去掉了test庫。

2) MySql5.7版本支持為表添加計算列

所謂計算列,就是通過其他列計算得到的值。

  • 5.7之前版本實現計算列一般通過觸發器實現。如下:
mysql> create trigger insr_tig before insert on t1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.09 sec)

mysql> create trigger upd_tig before update on t1 for each row set new.c3=new.c1+new.c2;
Query OK, 0 rows affected (0.01 sec)

mysql> show triggers;
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger  | Event  | Table | Statement                | Timing | Created                | sql_mode                                                                          | Definer        | character_set_client | collation_connection | Database Collation |
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| insr_tig | INSERT | t1    | set new.c3=new.c1+new.c2 | BEFORE | 2015-10-10 14:45:31.28 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
| upd_tig  | UPDATE | t1    | set new.c3=new.c1+new.c2 | BEFORE | 2015-10-10 14:45:55.33 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+----------+--------+-------+--------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)

mysql> insert into t1(c1,c2) values(1,2);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |    2 |    3 |
+----+------+------+------+
1 row in set (0.00 sec)

mysql> update t1 set c1=5 where id=1;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    5 |    2 |    7 |
+----+------+------+------+
1 row in set (0.00 sec)
  • 5.7版本實現計算列只需要在建表/修改表時添加列的as參數就可以了,如下:
mysql> create table t2(id int auto_increment not null,c1 int ,c2 int ,c3 int as(c1+c2),primary key(id));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t2(c1,c2) values(2,3);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    2 |    3 |    5 |
+----+------+------+------+
1 row in set (0.00 sec)

mysql> update t2 set c1=10 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |   10 |    3 |   13 |
+----+------+------+------+
1 row in set (0.00 sec)

3) 引入JSON列數據類型及相關函數

  • 5.7版本之前,只能在varchar或是text等字符類型的列中存儲json類型的字符串,並通過程序解析使用json字符串。
  • 5.7版本:增加了json列類型以及json_開頭的函數,如json_type(),json_object(),json_merge()等

 

mysql> show create table json_test;
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                          |
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| json_test | CREATE TABLE `json_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `jos` json NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

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

mysql> insert into json_test(jos) values(json_object("key1",1,"key2",2));
Query OK, 1 row affected (0.00 sec)

mysql> select * from json_test;
+----+------------------------+
| id | jos                    |
+----+------------------------+
|  1 | {"key1": 1, "key2": 2} |
+----+------------------------+
1 row in set (0.00 sec)

 

2、MySql5.7在復制中的新特性

1)支持多源復制

MySql5.7之前版本是不支持多源復制的,也就是多主一從,我們一般都是這樣的架構形式:

但是MySql5.7版本為我們實現了多主一從的方式,這種方式也有很多用處,比如我們利用從庫備份,以前都是一主一從,現在可以將多主復制到一從上,這樣省了很多機器,節約了成本。

 

2)基於庫或者邏輯鎖的多線程復制

  • Mysql5.7版本之前:

從5.6版本開始支持多線程復制,只不過是對於每個數據庫一個復制線程,作用不是很大。

  • MySql5.7版本:

增加了slave_parallel_type參數進行並發控制,用戶可以選擇database還是logical_lock,如果logical_lock實現了基於事務的多線程復制。

3)在線變更復制方式

  • MySql5.7之前

要把基於日志點的復制方式變為基於GTID的復制方式或者把基於GTID的復制方式變為基於日志點的復制方式必須要重啟master服務器。

  • MySql5.7之后

可以在線變更,不需要重啟服務器

3、MySql5.7在Innodb中的新特性

1)支持在線變更innodb_buffer_pool大小

  • MySql5.7之前:

要變更innodb_buffer_pool大小必須更改my.cnf文件后重啟數據庫服務器方生效。

  • MySql5.7之后:

變為動態參數,可以在線調整大小。

2)增加innodb_buffer_pool導入導出功能

  • MySql5.7之后:

增加以下參數控制innodb_buffer_pool的導入導出

innodb_buffer_pool_dump_pct

innodb_buffer_pool_dump_now

innodb_buffer_pool_dump_at_shutdown

innodb_buffer_pool_load_at_startup

innodb_buffer_pool_load_now

3)支持為Innodb建立表空間

  • MySql5.7之前:

具有系統共享表空間和為每個表建立的獨立表空間

  • MySql5.7之后:

支持create tablespace語法為一個表或者多個表建立公用表空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM