簡介html
MySQL 通過20來年發展示在已經是世界上最流行的開源數據庫,8.0 版本做爲5.7版本後的跨越大版本,除了大表秒級加列外還有其它什麼特性了?能在生產上使用嗎?MySQL5.7 怎麼才能無損升級到MySQL8.0?mysql
起源於上個世紀末的MySQL每隔2~3年就會發布一次大版本,不斷持續的「升級」。2008年MySQL被Sun公司以10億美圓收購,2009年甲骨文以74億美圓收購Sun公司,這是很成功的一次收購與被收購!13年和16年的MySQL5.六、MySQL5.7都是里程碑式的版本,有了不少質的飛躍;18年發佈了醞釀3年的MySQL8.0,又帶來了哪些新特性?sql
# 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不用老擔憂加列失敗(生產環境出現加列報主鍵衝突錯誤)數據庫
# 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倍json
文檔存儲無固定表結構動態schema是很受我們開發人員喜好的緩存
支持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安全
對每一個門店銷售量最高的商品進行統計,每一個部門按業績來排名網絡
SQL執行時內部優化器忽略指定索引;驗證刪除索引後對查詢性能影響多線程
Alter table t1 alter index idx_str invisible; Alter table t1 alter index idx_str visible;
索引按倒序存儲,以前方式都是按順序存儲;使用到具備倒序、升序列的複合索引併發
select * from tx where c1=10 order by c2 desc,c4 asc;
Where條件中沒法使用到索引成爲傳說!
select * from tx where year(date_)=2020;
須要加鎖的記錄若被其它線程佔有鎖,則跳過,而不是等待
select * from tx where c1=12 for update skip locked; Empty set (0.00 sec)
須要加鎖的記錄有鎖則報錯
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)場景如搶紅包、秒殺等有益
官方版多租戶資源隔離成爲了可能,更好提高在不一樣讀寫業務場景下的性能
之前版本MySQL數據字典存放在多個地方,一機器多實例時存在大量文件描述符性能消耗,8.0版本都存放在事務性InnoDB表,MySQL異常掛掉後也不會再出現表損壞狀況;DDL操做失敗也不會再留下佔空間的「臨時文件」
節點自動加入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
線上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> 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)
線上8.0.18 MGR大可能是從5.7.22 MySQL原地升級;依次升級從庫,online switch老主庫至新從庫(30s內完成),再升級老主庫
每一個產品、版本都有必定生命週期,數據庫也不列外,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/