1. 程式人生 > >mysql8.x新特性

mysql8.x新特性

一,預設編碼utf8
 預設編碼使用utf8mb4,utf8mb4編碼是utf8編碼的超集,相容utf8,並且能儲存4位元組的表情字元
歷史,MySQL資料庫的 “utf8”並不是真正概念裡的 UTF-8。

MySQL中的“utf8”編碼只支援最大3位元組每字元。
真正的大家正在使用的UTF-8編碼是應該能支援4位元組每個字元。

MySQL的開發者沒有修復這個bug。他們在2010年增加了一個變通的方法:一個新的字符集“utf8mb4”


另外,utf-32編碼固定使用4位元組,32bit儲存相比utf8浪費空間。

二,降序索引
在之前的版本中可以建立,但是實際建立的還是升序索引

mysql> create table t1(id1 int,id2 int,key(id1,id2 desc));
Query OK, 0 rows affected (0.10 sec)

mysql> show create table t1 \G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id1` int(11) DEFAULT NULL,
  `id2` int(11) DEFAULT NULL,
  KEY `id1` (`id1`,`id2` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

ERROR: 
No query specified

另外,由於降序索引的引入,MySQL 8.0再也不會對group by操作進行隱式排序

三,隱藏索引
隱藏索引的特性對於效能除錯非常有用。當一個索引隱藏時,它不會被查詢優化器所使用。
也就是說,我們可以隱藏一個索引,然後觀察對資料庫的影響。如果資料庫效能有所下降,就說明這個索引是有用的,於是將其“恢復顯示”即可;如果資料庫效能看不出變化,說明這個索引是多餘的,可以刪掉了

mysql> create index idx2 on t1(id1);
Query OK, 0 rows affected (0.35 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table t1 alter index idx2 invisible;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from t1 where key_name='idx2' \G;
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx2
 Seq_in_index: 1
  Column_name: id1
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: NO
1 row in set (0.01 sec)

ERROR: 
No query specified

當索引被隱藏時,它的內容仍然是和正常索引一樣實時更新的,這個特性本身是專門為優化除錯使用。如果你長期隱藏一個索引,那還不如干脆刪掉,因為畢竟索引的存在會影響插入、更新和刪除的效能

四,設定持久化
我們知道在oracle中可以使用scope設定引數確定是否到spfile,目前mysql也可以放在檔案中了,使用方法:

mysql> show variables like 'max_connects';
Empty set (0.07 sec)

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.01 sec)

mysql> set persist max_connections=1000;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1000  |
+-----------------+-------+
1 row in set (0.01 sec)

可以檢視在資料目錄datadir中的一個mysqld-auto.cnf檔案中儲存了設定,下次啟動時候將用此配置覆蓋預設配置引數
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1540437420567571 , "User" : "root" , "Host" : "" } } } }

五,通用表表達式(Common Table Expressions)
也可以稱為虛擬檢視,大大簡化複雜查詢

mysql> WITH
    ->  t1 AS (SELECT * FROM t1),
    ->  t2 AS (SELECT * FROM t1)
    -> SELECT t1.*, t2.* 
    -> FROM t1, t2;
+------+------+------+------+
| id1  | id2  | id1  | id2  |
+------+------+------+------+
|    1 |    2 |    1 |    2 |
+------+------+------+------+
1 row in set (0.00 sec)

六,視窗函式(Window Functions)
MySQL 被吐槽最多的特性之一就是缺少 rank() 函式,當需要在查詢當中實現排名時,必須手寫 @ 變數。但是從 8.0 開始,MySQL 新增了一個叫視窗函式的概念,它可以用來實現若干新的查詢方式
說明,視窗可以單獨建立。

mysql> create table tbl2(name varchar(10),amount int);
Query OK, 0 rows affected (0.16 sec)

mysql> insert into tbl2 values('usa',100),('china',101),('japan',103),('russian',99);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select t1.*,rank() over w as 'rank' from tbl2 as t1 window w as (order by amount);
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| russian |     99 |    1 |
| usa     |    100 |    2 |
| china   |    101 |    3 |
| japan   |    103 |    4 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,rank() over() as 'rank' from tbl2 as t1;
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| usa     |    100 |    1 |
| china   |    101 |    1 |
| japan   |    103 |    1 |
| russian |     99 |    1 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,rank() over(order by amount) as 'rank' from tbl2 as t1;
+---------+--------+------+
| name    | amount | rank |
+---------+--------+------+
| russian |     99 |    1 |
| usa     |    100 |    2 |
| china   |    101 |    3 |
| japan   |    103 |    4 |
+---------+--------+------+
4 rows in set (0.00 sec)

mysql> select t1.*,sum() over() as 'rank' from tbl2 as t1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') over() as 'rank' from tbl2 as t1' at line 1
mysql> select t1.*,sum(amount) over() as 'sum' from tbl2 as t1;
+---------+--------+------+
| name    | amount | sum  |
+---------+--------+------+
| usa     |    100 |  403 |
| china   |    101 |  403 |
| japan   |    103 |  403 |
| russian |     99 |  403 |
+---------+--------+------+
4 rows in set (0.00 sec)

七,安全性
對 OpenSSL 的改進、新的預設身份驗證、SQL 角色、密碼強度、授權。MySQL現在維護關於密碼歷史的資訊,允許對以前密碼的重用進行限制
比如常見的一個連線錯誤,參考:https://blog.csdn.net/jc_benben/article/details/80652897

八,增加JSON (json enhancements)AND OpenGIS spatial types
mysql提供了很多json相關的函式和API介面,添加了基於路徑查詢引數從 JSON 欄位中抽取資料的 JSON_EXTRACT() 函式,以及用於將資料分別組合到 JSON 陣列和物件中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函式

九,原子資料定義語句(原子DDL)(Atomic Data Definition Statements (Atomic DDL))

十,資源管理(Resource management)
 MySQL現在支援資源組的建立和管理,並允許將伺服器內執行的執行緒分配給特定組,以便執行緒根據組可用的資源執行。組屬性可以控制其資源,以啟用或限制組中執行緒的資源消耗

十一,Data dictionary.  
MySQL現在包含一個事務資料字典,用於儲存有關資料庫物件的資訊,In previous MySQL releases, dictionary data was stored in metadata files and nontransactional tables
比如myisam和innodb表定義frm檔案等

十二,innodb的增強
1,每次值更改時,當前最大自動增量計數器值將寫入重做日誌,並儲存到每個檢查點上的引擎專用系統表中。這些更改使當前最大自動增量計數器值在伺服器重新啟動時保持不變。

2,遇到索引樹損壞時, InnoDB將損壞標誌寫入重做日誌,這會使損壞標誌崩潰安全。InnoDB還將記憶體中損壞標誌資料寫入每個檢查點上的引擎專用系統表。在恢復期間, InnoDB從兩個位置讀取損壞標誌並在將記憶體表和索引物件標記為損壞之前合併結果。

3,InnoDB 分散式快取外掛支援多個get操作(讀取在一個單一的多鍵/值對分散式快取查詢)和範圍查詢

4,新的動態配置選項 innodb_deadlock_detect可用於禁用死鎖檢測。在高併發系統上,當許多執行緒等待同一個鎖時,死鎖檢測會導致速度減慢。有時,禁用死鎖檢測可能更有效,並且在innodb_lock_wait_timeout發生死鎖時依賴於事務回滾的設定。

5,INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表報告InnoDB每個索引緩衝池中快取的索引頁數 。

6,InnoDB現在,在共享臨時表空間中建立臨時表ibtmp1。

7,InnoDB 表空間加密功能支援重做日誌的加密和撤消日誌資料,

8,InnoDB支援 NOWAIT和SKIP LOCKED選項SELECT ... FOR SHARE以及SELECT ... FOR UPDATE鎖定讀取語句。 NOWAIT如果請求的行被另一個事務鎖定,則會立即返回該語句。SKIP LOCKED從結果集中刪除鎖定的行

SELECT ... FOR SHARE替換 SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用於向後相容

9,支援ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITION ALTER TABLE選項,

10,InnoDB儲存引擎現在使用MySQL的資料字典,而不是它自己的儲存引擎特定的資料字典

11,mysql系統表和資料字典表現在在MySQL資料目錄中InnoDB命名的單個表空間檔案建立mysql.ibd。以前,這些表是InnoDB在mysql資料庫目錄中的各個表空間檔案中建立的


還有很多別的特性,先說這麼多吧。