MySQL8.0新特性搶先看,效能又雙叒提升了

語言: CN / TW / HK

theme: awesome-green

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第25天,點選檢視活動詳情

📢📢📢📣📣📣\ 哈嘍!大家好,我是【IT邦德】,江湖人稱jeames007,10年DBA工作經驗\ 中國DBA聯盟(ACDU)成員,目前從事DBA及程式程式設計😜😜😜\ 擅長Oracle、MySQL、PG 運維開發,備份恢復,安裝遷移,效能優化、故障應急處理。\ ❤️❤️❤️感謝各位大可愛小可愛!❤️❤️❤️

摘要:官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,還帶來了大量的改進和更快的效能!本文做了詳細闡述

🍁 一、隱藏索引

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

🍃 1.1 操作語句

建立索引的語法: alter table t_index add index idx_col3(col3);

隱藏一個索引的語法: mysql> ALTER TABLE t_index ALTER INDEX idx_col3 INVISIBLE;

恢復顯示該索引的語法: mysql> ALTER TABLE t_index ALTER INDEX idx_col3 VISIBLE;

Visible 屬性: mysql> show index from t_index;

在這裡插入圖片描述

🍃 1.2 注意事項

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

🍁 二、引數設定持久化

MySQL 的設定可以在執行時通過 SET GLOBAL 命令來更改,\ 但是這種更改只會臨時生效,到下次啟動時資料庫又會從配置檔案中讀取。

🍃 2.1 SET PERSIST 命令

MySQL 8 新增了 SET PERSIST 命令,例如: mysql> set persist max_connections=300;

在這裡插入圖片描述

🍃 2.2 資料字典查詢

mysql> SELECT * FROM performance_schema.persisted_variables;

在這裡插入圖片描述

🍃 2.3 持久化清除

對於已經持久化了變數,可通過 reset persist 命令清除掉,\ 注意,其只是清空 mysqld-auto.cnf 和 performance_schema.persisted_variables 中的內容,\ 對於已經修改了的變數的值,不會產生影響。\ mysql> reset persist; 在這裡插入圖片描述

🍃 2.4 原理

MySQL 會將該命令的配置儲存到資料目錄下的 mysqld-auto.cnf 檔案中,\ 下次啟動時會讀取該檔案,用其中的配置來覆蓋預設的配置檔案。\ 不建議手動修改該檔案,因為其內容是 json 格式的,\ 其有可能導致資料庫在啟動過程中因解析錯誤而失敗

🍁 三、UTF-8 編碼

從 MySQL 8 開始,資料庫的預設編碼將改為 utf8mb4,這個編碼包含了所有 emoji 字元。 多少年來我們使用 MySQL 都要在編碼方面小心翼翼, 生怕忘了將預設的 latin 改掉而出現亂碼問題。從此以後就不用擔心了。

-- 建立資料庫 mysql> CREATE DATABASE mes_db charset utf8mb4;

🍁 四、表示式WITH

其實 WITH 表示式除了和 SELECT 一起用,有很多的組合:\ insert with 、with update、with delete、with with、with recursive\ (可以模擬數字、日期等序列)、WITH 可以定義多張表

🍃 4.1 生成日期序列

css WITH recursive seq_date (log_date) AS (SELECT '2022-01-01' UNION ALL SELECT log_date + INTERVAL 1 DAY FROM seq_date WHERE log_date + INTERVAL 1 DAY < '2022-01-14') SELECT log_date FROM seq_date; +------------+ | log_date | +------------+ | 2022-01-01 | | 2022-01-02 | | 2022-01-03 | | 2022-01-04 | | 2022-01-05 | | 2022-01-06 | | 2022-01-07 | | 2022-01-08 | | 2022-01-09 | | 2022-01-10 | | 2022-01-11 | | 2022-01-12 | | 2022-01-13 | +------------+ 13 rows in set (0.00 sec)

🍃 4.2 多個表示式來 JOIN

複雜的查詢會使用嵌入式表,例如: SELECT t1., t2. FROM (SELECT col1 FROM table1) t1, (SELECT col2 FROM table2) t2;

而有了 CTE,我們可以這樣寫: WITH t1 AS (SELECT col1 FROM table1), t2 AS (SELECT col2 FROM table2) SELECT t1., t2. FROM t1, t2; 這樣看上去層次和區域都更加分明,改起來也更清晰的知道要改哪一部分。

🍁 五、視窗函式

🍃 5.1 新特性

MySQL 被吐槽最多的特性之一就是缺少 rank() 函式,\ 當需要在查詢當中實現排名時,必須手寫 @ 變數。但是從 8.0 開始,\ MySQL 新增了一個叫視窗函式的概念,它可以用來實現若干新的查詢方式。\ 視窗函式有點像是 SUM()、COUNT() 那樣的集合函式,\ 但它並不會將多行查詢結果合併為一行,而是將結果放回多行當中。\ 也就是說,視窗函式是不需要 GROUP BY 的。

🍃 5.2 建表

```css create table scores_tb ( id int auto_increment primary key, xuehao int not null, score int not null ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into scores_tb (xuehao,score) values (1001,89), (1002,99), (1003,96), (1004,96), (1005,92), (1006,90), (1007,90), (1008,94); select * from scores_tb; ```

🍃 5.3 排序對比

按分數高低直接排名,從 1 開始,往下排,類似於 row number

5.7版本SQL如下: SELECT xuehao, score, @curRank := @curRank + 1 AS rank FROM scores_tb, ( SELECT @curRank := 0 ) r ORDER BY score desc;

8.0版本 select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;

在這裡插入圖片描述 在這裡插入圖片描述

cd0cc1d6fe704cdf90f6c3ddcf4aacde.gif