一. Mysql8.0版本相比以前版本的一些特性mysql
1) 默認編碼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浪費空間。sql
2) 降序索引
在以前的版本中能夠建立,可是實際建立的仍是升序索引數據庫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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操做進行隱式排序json
3) 隱藏索引
隱藏索引的特性對於性能調試很是有用。當一個索引隱藏時,它不會被查詢優化器所使用。也就是說,咱們能夠隱藏一個索引,而後觀察對數據庫的影響。若是數據庫性能有所降低,就說明這個索引是有用的,因而將其「恢復顯示」便可;若是數據庫性能看不出變化,說明這個索引是多餘的,能夠刪掉了.數組
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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
|
當索引被隱藏時,它的內容仍然是和正常索引同樣實時更新的,此特性是專門爲優化調試使用。若是長期隱藏一個索引,那還不如干脆刪掉,由於畢竟索引存在會影響插入、更新和刪除的性能.緩存
4) 設置持久化
在oracle中可使用scope設置參數肯定是否到spfile, 如今mysql8.0也能夠放在文件中了,使用方法:安全
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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" : "" } } } }bash
5) 通用表表達式(Common Table Expressions)
也能夠稱爲虛擬視圖,大大簡化複雜查詢服務器
1
2
3
4
5
6
7
8
9
10
11
|
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)
|
6) 窗口函數(Window Functions)
MySQL 被吐槽最多的特性之一就是缺乏 rank() 函數,當須要在查詢當中實現排名時,必須手寫 @ 變量。可是從 8.0 開始,MySQL 新增了一個叫窗口函數的概念,它能夠用來實現若干新的查詢方式
說明,窗口能夠單首創建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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)
|
7) 安全性
對 OpenSSL 的改進、新的默認身份驗證、SQL 角色、密碼強度、受權。MySQL如今維護關於密碼歷史的信息,容許對之前密碼的重用進行限制
好比常見的一個鏈接錯誤,參考:https://blog.csdn.net/jc_benben/article/details/80652897
8) 增長JSON (json enhancements)AND OpenGIS spatial types
mysql提供了不少json相關的函數和API接口,添加了基於路徑查詢參數從 JSON 字段中抽取數據的 JSON_EXTRACT() 函數,以及用於將數據分別組合到 JSON 數組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數
9) 原子數據定義語句(原子DDL)(Atomic Data Definition Statements (Atomic DDL))
10) 資源管理(Resource management)
MySQL如今支持資源組的建立和管理,並容許將服務器內運行的線程分配給特定組,以便線程根據組可用的資源執行。組屬性能夠控制其資源,以啓用或限制組中線程的資源消耗
11) Data dictionary
MySQL如今包含一個事務數據字典,用於存儲有關數據庫對象的信息,In previous MySQL releases, dictionary data was stored in metadata files and nontransactional tables
好比myisam和innodb表定義frm文件等.
12) 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數據庫目錄中的各個表空間文件中建立的;