MySQL8.0新特性搶先看,效能又雙叒提升了
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;
- 還用寬表?體驗一下DQL成就新一代的BI吧
- 大資料計算,如何優化SQL?
- MySQL高可用之MHA架構企業實戰
- 【牛客刷題-SQL大廠面試真題】NO5.某寶店鋪分析(電商模式)
- 內卷時代,35歲程式猿轉行DBA|2022 年中總結
- MySQL高可用之多源複製
- MySQL8.0新特性搶先看,效能又雙叒提升了
- Oracle表碎片對效能有多大影響?
- 趣味端午節,程式猿特殊的獻禮
- 【微信小程式開發】第1篇:開發工具安裝及程式配置
- CentOS7部署Mysql8.0.27
- MySQL中COLLATE是用來做什麼的?
- PostgreSQL大總結,小白最適合了
- Mysql快速找回root密碼妙招
- Python字典介紹
- Mysql日期型別剖析
- Python元組詳解
- Python列表詳解
- Python字串詳解
- Windows安裝Mysql(msi 圖形安裝)