1. 程式人生 > >跨時代的MySQL8.0新特性解讀

跨時代的MySQL8.0新特性解讀

[toc] ****簡介**** >MySQL 經過20來年發展現在已是世界上最流行的開源資料庫,8.0 版本作為5.7版本後的跨越大版本,除了大表秒級加列外還有其它什麼特性了?能在生產上使用嗎?MySQL5.7 怎麼才能無損升級到MySQL8.0? # MySQL發展歷程 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231439217-392853146.png) >起源於上個世紀末的MySQL每隔2~3年就會發布一次大版本,不斷持續的“升級”。2008年MySQL被Sun公司以10億美元收購,2009年甲骨文以74億美元收購Sun公司,這是很成功的一次收購與被收購!13年和16年的MySQL5.6、MySQL5.7都是里程碑式的版本,有了很多質的飛躍;18年釋出了醞釀3年的MySQL8.0,又帶來了哪些新特性? # MySQL8.0新特性 ## 秒級加列 - 只改資料字典表元資料資訊 - 5.7和8.0 sbteset1表資料分別為3000w ``` # mysql8.0.18 mysql> alter table sbtest1 add str varchar(200) not null default 'mysql8.0 新加欄位'; Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 # mysql5.7.16 mysql> alter table sbtest1 add str varchar(200) not null default 'mysql5.7 新加欄位'; Query OK, 0 rows affected (6 min 8.36 sec) Records: 0 Duplicates: 0 Warnings: 0 ``` > 以前表加列操作需要重建表(消耗大量的IO資源和時間),8.0加列沒有這個步驟。秒級加列(不要指定列位置,如after str1)讓開發人員再也不用等到大半夜列加完後再上線了,也讓我們dba不用老擔心加列失敗(生產環境出現加列報主鍵衝突錯誤) --- ## 效能提升 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231534511-645174946.png) ``` # mysql5.7.16 mysql> select count(*) from sbtest1; +----------+ | count(*) | +----------+ | 29991137 | +----------+ 1 row in set (3 min 12.24 sec) # mysql8.0.18 mysql> select count(*) from sbtest1; +----------+ | count(*) | +----------+ | 30000000 | +----------+ 1 row in set (45.70 sec) ``` > 分別在只更新和只讀場景下,8.0相比5.7在高併發時效能提升近1倍;求表總資料量8.0響應時間也將近提升5倍 --- ## 文件資料庫 - MySQL Document Store,NoSQL + SQL = MySQL - 多文件事務,ACID特性 - 支援更新JSON中部分filed ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231548737-471213384.png) >文件儲存無固定表結構動態schema是很受咱們開發人員喜愛的 --- ## SQL增強 ### 共用表表達式(CTEs) - 讓SQL語句更加簡單、直觀 >支援CTE的DB有 Teradata, DB2, Firebird, Microsoft SQL Server, Oracle ,PostgreSQL (since 8.4), MariaDB (since 10.2), SQLite (since 3.8.3), HyperSQL and H2 (experimental), MySQL8.0 - 視窗函式 > 對每個門店銷售量最高的商品進行統計,每個部門按業績來排名 - 共用表表達式(CTEs)和視窗函式是報表、OLAP業務一大利器 --- ### 不可見索引(Invisible Indexes) > SQL執行時內部優化器忽略指定索引;驗證刪除索引後對查詢效能影響 ``` Alter table t1 alter index idx_str invisible; Alter table t1 alter index idx_str visible; ``` --- ### 降序索引(Descending Indexes) >索引按倒序儲存,之前方式都是按順序儲存;使用到具有倒序、升序列的複合索引 ``` select * from tx where c1=10 order by c2 desc,c4 asc; ``` --- ### 函式索引 (Functional Indexes) >Where條件中無法使用到索引成為傳說! ``` select * from tx where year(date_)=2020; ``` ## 預設字符集為utf8mb4 - 更好的儲存補充字元,如emojis表情符號 - 可變長度編碼字元效能提升 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231615616-737954358.png) --- ## 一致性查詢改進(Better Handling of Hot Rows) - SKIP LOCKED >需要加鎖的記錄若被其它執行緒佔有鎖,則跳過,而不是等待 ``` select * from tx where c1=12 for update skip locked; Empty set (0.00 sec) ``` - NOWAIT > 需要加鎖的記錄有鎖則報錯 ``` select * from tx where c1=12 for update nowait; ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set. ``` > SKIP LOCKED和NOWAIT對熱行(Hot Rows)場景如搶紅包、秒殺等有益 --- ## 資源組(Resource Groups) - 執行緒賦給不同的資源組 - 資源組和不同的記憶體、IO、CPU(現僅支援)進行關聯 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231630943-143213989.png) >官方版多租戶資源隔離成為了可能,更好提升在不同讀寫業務場景下的效能 --- ## 新的資料字典 - 基於innodb的庫表元資料資訊 - 增強了MySQL crash-safe能力 - 原子DDL( Atomic DDLs ) ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011231641990-421454610.png) >以前版本MySQL資料字典存放在多個地方,一機器多例項時存在大量檔案描述符效能消耗,8.0版本都存放在事務性InnoDB表,MySQL異常掛掉後也不會再出現表損壞情況;DDL操作失敗也不會再留下佔空間的“臨時檔案” --- ## MGR增強 - 金融級別99.999%官方高可用方案 - MGR是業務多活(應用多活+資料庫多活)的終極方案 - 多個MySQL組成一個group,資料寫group - 線上10套多主8.0 MGR叢集 節點自動加入group次數 https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_autorejoin_tries group剔除異常節點等待時間 https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_member_expel_timeout 節點自行脫離group等待時間 https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_unreachable_majority_timeout ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011232012106-1025905668.png) > 線上8.0.18 MGR已穩定執行大半年,MGR的增強大大提升了在網路異常(機房級故障)下的健壯、穩定性;之前多次的機房故障演練8.0 MGR也都符合預期,網路恢復後MGR節點自動加入group 恢復讀寫 --- ## 安全增強 ``` SQL Roles SQL角色 Atomic ACL Statements 原子ACL語句 Dynamic Privileges 動態特權 Protection Against Brute Force Attacks 防止暴力攻擊 REDO & UNDO Logs Encryption REDO & UNDO Logs加密 Caching sha2 authentication plugin 快取Sa2認證外掛 Password Rotation Policy 密碼輪詢策略 ``` --- ## 複製增強 ``` Additional Metadata in the binary log binlog中額外的Metadata Efficient JSON Replication 高效的json複製 Monitor Replication Lag with Microsecond Precision 監控複製延遲細到毫秒 More P_S Instrumentation for Group Replication 組複製更多的P_S Enable binary log by default 預設啟動了binlog Improving the Parallel Applier with Writeset-based Dependency Tracking 基於Writeset-based Dependency Tracking的並行應用 Hostname support in Group Replication Whitelist 組複製白名單中支援主機名 ``` --- ## 例項克隆 - 傳統方式,備份恢復再加入主從複製 - 源目標例項上安裝克隆外掛、授權、進行克隆 - 極大提高了MySQL的擴充套件性 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011232128001-463128524.png) --- ## 全域性變數持久化 - SYSTEM_VARIABLES_ADMIN (SET PERSIST) - PERSIST_RO_VARIABLES_ADMIN (SET PERSIST_ONLY) ``` mysql> set persist_only innodb_buffer_pool_size=268435456*2; Query OK, 0 rows affected (0.00 sec) mysql> mysql> set persist innodb_buffer_pool_size=268435456*2; Query OK, 0 rows affected (0.00 sec) ``` --- ## 其它特性 - 優化器直方圖 - 自增主鍵持久化 - 移除Query Cache - GIS增強 - 備份鎖 - group by 不再隱式排序 - redo_log優化、多執行緒併發寫log buffer # MySQL5.7升級8.0 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011232137439-875293576.png) >線上8.0.18 MGR大多是從5.7.22 MySQL原地升級;依次升級從庫,online switch老主庫至新從庫(30s內完成),再升級老主庫 # 展望未來 ![](https://img2020.cnblogs.com/blog/1179590/202010/1179590-20201011232145909-25998418.png) >每個產品、版本都有一定生命週期,資料庫也不列外,MySQL5.6 甲骨文官方支援到明年;也不是為了用新版本而“新版本”,主要是為了提升效能,享受開源帶來的紅利,更好地支援業務 MySQL 8.0 Release Notes https://dev.mysql.com/doc/relnotes/mysql/8.0/en/preface.html Oracle Lifetime Support for MySQL https://www.oracle.com/us/assets/lifetime-support-technology-069183.pdf MySQL8.0 Benchmarks https://www.mysql.com/why-mysql/benchmarks/ [MySQL add/drop欄位時報主鍵衝突](https://mp.weixin.qq.com/s/tzShTHrunhgFxeLxLzi5fA) [圖解MySQL | MySQL 為表新增列 是怎麼"立刻"完成的](https://mp.weixin.qq.com/s/i2WOxqsGmvwCHQ4H