MySQL的開發周期
在比較之前,首先提一下MySQL的開發周期.
MySQL一個大版本的開發,大致經歷如下幾個階段:
- Feature Development
- Feature Testing
- Performance Testing
- Lab Releases
- Development Milestone Releases
- General Availability Release(GA)
Feature Development
也即是所謂的特性開發階段。這個階段是常規的功能點確定,代碼開發,完成CR以及QA等常規的開發流程。
在一系列的測試以及bugfix之后,當QA “signs off” 即測試通過之后,會合並到TRUNK之中。
Feature Testing
即特性測試階段。
特性測試的階段,從質量保證的角度出發,MySQL的測試工作將會有以下的關注點:
- 完成新特性的基本測試工作
- 未出現性能衰減/特性的倒退
- 至少達到80%的代碼覆蓋率
一個新特性達到要能被合並到TRUNK之中,需要滿足如下條件:
- 沒有任何已知的錯誤,包括那些微小的錯誤
- 沒有任何已知的性能衰減/特性的倒退
- 代碼覆蓋率達到預期
- 自動化測試集中需要有這一新特性的回歸測試用例
Performance Testing
作為應用的基礎組件,性能是絕大多數開發人員都在關注的問題。在特性測試完成之后,將要進行的是性能測試。
性能測試主要關注兩個指標:吞吐量和響應時間。
針對於吞吐量的測試,會有如下的特點:
- 並發測試范圍從
8到1024個連接 - 使用諸如
sysbench這類開源軟件,進行簡單OLTP(基本的事務處理)的測試,每個測試時間在5-10min范圍內,隨着數據集以及系統配置而定 - 針對特定場景也會有相應的測試用例
- 測試數據會被存儲到數據庫中,以便比較或者確定測試的基准值
而對於響應時間的測試,則會有如下的特點:
- 在單個被測試線程上完成測試
- 准備兩方面測試用例,分別考驗計算復雜型場景和IO密集型場景
Lab Releases
實驗室發布是在用戶對某一特性有着強烈的興趣時,發布的快照版本,通常還沒有合並到TRUNK之中。
實驗室發布版本存在的特性,並不會保證在正式版等版本中存在。如果想要嘗鮮,可以訪問labs.mysql.com。
Development Milestone Releases
上述步驟結束之后,到了DMR階段,也就是本次 8.0 版本所處的階段。
DMR將會是一個重復迭代的階段,下一個DMR版本將會包含上一個DMR版本的新特性或者功能修復。並且,DMR了的MySQL將會支持所有的平台,DMR狀態下的MySQL的代碼質量是達到了可供發布的水准的。
DMR看起來像是游戲的公測版本,每3-6個月會發布一個版本,每個DMR版本的MySQL會有一個特性需求收集截止時間點,新增的特性會歷經開發、測試的歷程,合並到TRUNK之中,變為下一個DMR。
總之,DMR的目的就是能夠時常發布,讓用戶和客戶能夠反饋需求,體驗新版本。
General Availability Release(GA)
終於,在n個DMR之后,MySQL表現穩定,需求“無可”增加,客戶滿意,質量過關。
基於最后一個DMR版本,會發布GA版本,即我們可以“放心”使用在生產環境中的MySQL。
每個GA版本的發布周期間隔在18-24個月。
版本比較
對於這些MySQL版本,如果想要了解之間的差異,一個可行的辦法是閱讀GA版本的Release Notes。
MySQL 的近幾個版本發行時間間隔並不太大:
| 版本 | GA 版本發布時間 |
|---|---|
| 5.5.8 | 2010-12-03 |
| 5.6.10 | 2013-02-05 |
| 5.7.9 | 2015-10-21 |
大約2年會有一個較大更新的版本會發出。
新特性
對於使用者而言,新特性應該是關注的第一焦點。下面會針對版本列出一些個人認為有特點的新特性。
5.5
InnoDB 作為默認存儲引擎
InnoDB 因為支持事務、行級別鎖而廣為人知,並廣泛應用。但是在之前的版本中,InnoDB並不是默認的存儲引擎。在5.5中,InnoDB成為了默認的存儲引擎。
半同步復制
半同步復制(Semisynchronous Replication)在MySQL 5.5中被支持(以插件形式實現)。
默認的MySQL通過異步模式進行復制,主庫寫入binlog之后,從庫不一定能夠被讀取並處理,因為寫入成功只是說明在主庫上成功。主從不同步帶來的問題相當之多,提升了開發難度。
而半同步復制則是主庫需要有至少一個半同步從庫,當一次寫入操作進行之后,至少在主庫和至少一個半同步從庫上都完成了寫入之后,用戶才會收到已成功的信息。
半同步復制在這一程度上提高了數據的安全性。
5.6
MySQL 5.6 的主要變化在性能優化方面。有一些小的新特性也值得關注。
表中可以設置多個Timestamp屬性
MySQL 5.5 中,如果設定多個Timestamp的屬性為 ON UPDATE CURRENT_TIMESTAMP 時,這樣的操作是不能完成的,這樣的需求,通常要在業務代碼中完成。
而到了 MySQL 5.6 中,這樣的操作可以直接通過設定字段的屬性即可完成。
InnoDB 支持全文索引
全文索引 MyISAM 存儲引擎之前相對於InnoDB的一個“優勢”特性,在MySQL 5.6中不復存在。
針對字符串型的字段(CHAR,VARCHAR或者TEXT),可以選擇在創建表時增加這個類型的索引。也可以后續添加。
InnoDB的全文索引也使用的是倒排索引的設計,分詞完成的詞匯將會存儲在獨立的索引表之中。當包含全文索引的字段插入之后,會進行分詞,同時先將分詞結果進入內存緩存,之后再刷入索引表中,避免一次寫入帶來的大量附加的小規模的更改操作。
多線程復制
在MySQL 5.6中,會針對每一個數據庫開啟一個獨立的復制線程,如果數據庫壓力平均的話,對於主從同步延遲會有一定的改善。但是如果數據操作都在一個數據庫上,就不會有太多顯著的效果了。
加入全局事務ID(GTID)
在MySQL 5.6前,如果從庫宕機,重啟之后需要進行同步,需要知道binlog文件名已經位置。
在MySQL 5.6中,加入了GTID(global transaction identifier)。GTID由source_id和transaction_id構成,source_id標識主庫,transaction_id標識在數據庫上進行的事務,格式即GTID = source_id:transaction_id。
在加入GTID之后,重啟從庫之后,不需要重新進行位置的指向,只需要連接到主庫即可,剩下的步驟將會是自動的。
5.7
InnoDB
InnoDB地位進一步增強,這一次系統表已然變成了基於InnoDB存儲引擎的表。並且也不能禁用InnoDB存儲引擎了。
增強的多線程復制
在5.6中添加的多線程復制的增強版,針對每個數據庫可以增加線程數進行同步,對5.7.9版本,在實際使用中,在機械盤的服務器上,原有業務高峰時主從同步延遲在10-30分鍾左右,使用5.7.9之后基本實現了數據上的同步。
多源復制
即將多個主庫的數據歸並到一個從庫的實例上。
之前的MySQL,每個從庫都只能擁有一個主庫,如今MySQL提供了官方的解決方案,用於將多個主庫的數據同步到一個從庫之上。
多源復制有一個關鍵概念,即頻道(channel)。頻道指代一個主從庫之間用於同步binlog的連接,通過新增的FOR CHANNEL子句,指定一個非空的頻道名稱,按照先前版本的連接主庫的方法,即可實現多源復制功能。
需要注意的是,當多個主庫均寫入同一張表時,是要自行處理主鍵沖突。
JSON數據類型操作
PostgreSQL 9.3開始,PostgreSQL中JSON成為了內置的數據類型。
作為被廣泛使用的數據組織格式,之前版本的只能講JSON格式數據按照字符串形式進行存儲。
到了5.7之后,JSON支持也被加入。
JSON中的字符串在MySQL中會被轉化成utf8mb4的字符集,給攜帶諸如emoji字符的數據的存儲帶來了方便。
對於JSON數據的結構特性,MySQL中對JSON的查詢需要借助path expression以及JSON_EXTRACT方法進行查詢。path expression的簡要要點如下:
- 以
$符號開頭 .符號緊接着的是對象中的key[n]中表示的是數組中的第n個元素,n>=0.[*]表示一個key下的所有對象[*]表示一個key下所有的數組exp_a**exp_b則表示path中帶有exp_a與exp_b的值- key如果包含特殊字符,需要通過雙引號包裹起來
更多操作參見手冊。
innodb_buffer_pool_size參數動態修改
在之前的版本中,innodb_buffer_pool_size調整之后,需要重啟數據庫實例,這個對於線上業務幾乎是不可接受的。硬件性能強悍的服務器,調整這一參數之后,MySQL的表現會有較為客觀的提升。
到了MySQL 5.7,這一參數終於可以在線調整了。
初始化工具
在之前的版本中,初始化系統表一般都會使用mysql_install_db腳本,到MySQL 5.7之后建議使用mysqld --initialize完成實例初始化。
在通過mysqld --initialize進行初始化時,需要加上--initial-insecure才能實現空密碼登錄,否則會將初始化的默認密碼寫入到錯誤文件中。
初始化完成之后,還需要使用MySQL 5.7版本的客戶端登錄,並且修改默認密碼。
8.0
作為版本號突飛猛進的一個版本,在MySQL 8.0中新增了如下的特性:
用戶角色
8.0中將會增強賬號管理的功能,提供角色這一概念,即能組合權限,批量授權給某一用戶。
增強的InnoDB
- 自增id會寫入到redo log中,這一改動使得數據庫重啟之后的自增值能恢復到重啟前的狀態
- 增加了死鎖檢測開關
innodb_deadlock_detect,可以在高並發系統中動態調整這一特性,提升性能
增強的JSON操作
- 增加了
->>操作符,使用這一操作符等同於對JSON_EXTRACT的結果進行JSON_UNQUOTE操作,簡化了SQL語句 - 增加了按JSON數據組織返回數據操作的兩個方法:
JSON_ARRAYAGG與JSON_OBJECTAGG。JSON_ARRAYAGG將某列的值按照一個JSON數據返回,而JSON_OBJECTAGG將列A作為鍵,列B作為值,返回一個JSON對象格式的數據
