MySQL 5.6, 5.7, 8.0的新特性

對於MySQL的歷史,相信很多人早已耳熟能詳,這裏就不要贅述。

下面僅從產品特性的角度梳理其發展過程中的里程碑事件。

1995年,MySQL 1.0發佈,僅供內部使用。

1996年,MySQL 3.11.1發佈,直接跳過了MySQL 2.x版本。

1999年,MySQL AB公司成立。同年,發佈MySQL 3.23,該版本集成了Berkeley DB存儲引擎。該引擎由Sleepycat公司開發,支持事務。在集成該引擎的過程中,對源碼進行了改造,爲後續可插拔式存儲引擎架構奠定了基礎。

2000年,ISAM升級爲MyISAM存儲引擎。同年,MySQL基於GPL協議開放源碼。

2002年,MySQL 4.0發佈,集成了後來大名鼎鼎的InnoDB存儲引擎。該引擎由Innobase公司開發,支持事務,支持行級鎖,適用於OLTP等高併發場景。

2005年,MySQL 5.0發佈,開始支持遊標,存儲過程,觸發器,視圖,XA事務等特性。同年,Oracle收購Innobase公司。

2008年,Sun以10億美金收購MySQL AB。同年,發佈MySQL 5.1,其開始支持定時器(Event scheduler),分區,基於行的複製等特性。

2009年,Oracle以74億美金收購Sun公司。

2010年,MySQL 5.5發佈,其包括如下重要特性及更新。

InnoDB代替MyISAM成爲MySQL默認的存儲引擎。

多核擴展,能更充分地使用多核CPU。

InnoDB的性能提升,包括支持索引的快速創建,表壓縮,I/O子系統的性能提升,PURGE操作從主線程中剝離出來,Buffer Pool可拆分爲多個Instances。

半同步複製。

引入utf8mb4字符集,可用來存儲emoji表情。

引入metadata locks(元數據鎖)。

分區表的增強,新增兩個分區類型:RANGE COLUMNS和LIST COLUMNS。

MySQL企業版引入線程池。

可配置IO讀寫線程的數量(innodb_read_io_threads, innodbwrite io_threads)。在此之前,其數量爲1,且不可配置。

引入innodb_io_capacity選項,用於控制髒頁刷新的數量。

2013年,MySQL 5.6發佈,其包括如下重要特性及更新。

GTID複製。

無損複製。

延遲複製。

基於庫級別的並行複製。

mysqlbinlog可遠程備份binlog。

對TIME, DATETIME和TIMESTAMP進行了重構,可支持小數秒。DATETIME的空間需求也從之前的8個字節減少到5個字節。

Online DDL。ALTER操作不再阻塞DML。

可傳輸表空間(transportable tablespaces )。

統計信息的持久化。避免主從之間或數據庫重啓後,同一個SQL的執行計劃有差異。

全文索引。

InnoDB Memcached plugin。

EXPLAIN可用來查看DELETE,INSERT,REPLACE,UPDATE等DML操作的執行計劃,在此之前,只支持SELECT操作。

分區表的增強,包括最大可用分區數增加至8192,支持分區和非分區表之間的數據交換,操作時顯式指定分區。

Redo Log總大小的限制從之前的4G擴展至512G。

Undo Log可保存在獨立表空間中,因其是隨機IO,更適合放到SSD中。但仍然不支持空間的自動回收。

可dump和load Buffer pool的狀態,避免數據庫重啓後需要較長的預熱時間。

InnoDB內部的性能提升,包括拆分kernel mutex,引入獨立的刷新線程,可設置多個purge線程。

優化器性能提升,引入了ICP,MRR,BKA等特性,針對子查詢進行了優化。

可以說,MySQL 5.6是MySQL歷史上一個里程碑式的版本,這也是目前生產上應用得最廣泛的版本。

2015年,MySQL 5.7發佈,其包括如下重要特性及更新。

組複製

InnoDB Cluster

多源複製

增強半同步(AFTER_SYNC)

基於WRITESET的並行複製。

在線開啓GTID複製。

在線設置複製過濾規則。

在線修改Buffer pool的大小。

在同一長度編碼字節內,修改VARCHAR的大小隻需修改表的元數據,無需創建臨時表。

可設置NUMA架構的內存分配策略( innodb_numa_interleave)。

透明頁壓縮(Transparent Page Compress ion)。

UNDO表空間的自動回收。

查詢優化器的重構和增強。

可查看當前正在執行的SQL的執行計劃(EXPLAIN FOR CONNECTION)。

引入了查詢改寫插件(Query Rewrite Plugin),可在服務端對查詢進行改寫。

EXPLAIN FORMAT=JSON會顯示成本信息,這樣可直觀的比較兩種執行計劃的優劣。

引入了虛擬列,類似於Oracle中的函數索引。

新實例不再默認創建test數據庫及匿名用戶。

引入ALTER USER命令,可用來修改用戶密碼,密碼的過期策略,及鎖定用戶等。

mysql.user表中存儲密碼的字段從password修改爲authentication_string。

表空間加密。

優化了Performance Schema,其內存使用減少。

Performance Schema引入了衆多instrumentation。常用的有Memory usage instrumentation,可用來查看MySQL的內存使用情況,Metadata Locking Instrumentation,可用來查看MDL的持有情況,Stage Progress instrumentation,可用來查看Online DDL的進度。

同一觸發事件(INSERT, DELETE, UPDATE),同一觸發時間(BEFORE, AFTER),允許創建多個觸發器。在此之前,只允許創建一個觸發器。

InnoDB原生支持分區表,在此之前,是通過ha_partition接口來實現的。

分區表支持可傳輸表空間特性。

集成了SYS數據庫,簡化了MySQL的管理及異常問題的定位。

原生支持JSON類型,並引入了衆多JSON函數。

引入了新的邏輯備份工具-mysqlpump,支持表級別的多線程備份。

引入了新的客戶端工具-mysqlsh,其支持三種語言:JavaScript, Python and SQL。兩種API:X DevAPI,AdminAPI,其中,前者可將MySQL作爲文檔型數據庫進行操作,後者用於管理InnoDB Cluster。

mysql_install_db被mysqld --initialize代替,用來進行實例的初始化。

原生支持systemd。

引入了super_read_only選項。

可設置SELECT操作的超時時長(max_execution_time)。

可通過SHUTDOWN命令關閉MySQL實例。

引入了innodb_deadlock_detect選項,在高併發場景下,可使用該選項來關閉死鎖檢測。

引入了Optimizer Hints,可在語句級別控制優化器的行爲,如是否開啓ICP,MRR等,在此之前,只有Index Hints。

GIS的增強,包括使用Boost.Geometry替代之前的GIS算法,InnoDB開始支持空間索引。

2018年,MySQL 8.0發佈,其包括如下重要特性及更新。

引入了原生的,基於InnoDB的數據字典。數據字典表位於mysql庫中,對用戶不可見,同mysql庫的其它系統表一樣,保存在數據目錄下的mysql.ibd文件中。不再置於mysql目錄下。

Atomic DDL。

重構了INFORMATION_SCHEMA,其中,部分表已重構爲基於數據字典的視圖,在此之前,其爲臨時表。

PERFORMANCE_SCHEMA查詢性能提升,其已內置多個索引。

不可見索引(Invisible index)。

降序索引。

直方圖。

公用表表達式(Common table expressio ns)。

窗口函數(Window functions)。

角色(Role)。

資源組(Resource Groups),可用來控制線程的優先級及其能使用的資源,目前,能被管理的資源只有CPU。

引入了innodb_dedicated_server選項,可基於服務器的內存來動態設置innodb_buffer_pool_size, innodb_logfile size和innodb_flush_method。

快速加列(ALGORITHM=INSTANT)。

JSON字段的部分更新(JSON Partial Updates)。

自增主鍵的持久化。

可持久化全局變量(SET PERSIST)。

默認字符集由latin1修改爲utf8mb4。

默認開啓UNDO表空間,且支持在線調整數量(innodb_undo_tablespaces)。在MySQL 5.7中,默認不開啓,若要開啓,只能初始化時設置。

備份鎖。

Redo Log的優化,包括允許多個用戶線程併發寫入log buffer,可動態修改innodb_log_buffer_size的大小。

默認的認證插件由mysql_native_password更改爲caching_sha2_password。

默認的內存臨時表由MEMORY引擎更改爲TempTable引擎,相比於前者,後者支持以變長方式存儲VARCHAR,VARBINARY等變長字段。從MySQL 8.0.13開始,TempTable引擎支持BLOB字段。

Grant不再隱式創建用戶。

SELECT ... FOR SHARE和SELECT ... FOR UPDATE語句中引入NOWAIT和SKIP LOCKED選項,解決電商場景熱點行問題。

正則表達式的增強,新增了4個相關函數,REGEXP_INSTR(), REGEXP_LIKE(), REGEX P_REPLACE(), REGEXP_SUBSTR()。

查詢優化器在制定執行計劃時,會考慮數據是否在Buffer Pool中。而在此之前,是假設數據都在磁盤中。

ha_partition接口從代碼層移除,如果要使用分區表,只能使用InnoDB存儲引擎。

引入了更多細粒度的權限來替代SUPER權限,現在授予SUPER權限會提示warning。

GROUP BY語句不再隱式排序。

MySQL 5.7引入的表空間加密特性可對Redo Log和Undo Log進行加密。

information_schema中的innodb_locks和innodb_lock_waits表被移除,取而代之的是performance_schema中的data_locks和data_lock_waits表。

引入performance_schema.variables_info表, 記錄了參數的來源及修改情況。

增加了對於客戶端報錯信息的統計(performance_schema.events_errors_summary_xxx)。

可統計查詢的響應時間分佈(call sys.ps_statement_avg_latency_histogram())。

支持直接修改列名(ALTER TABLE ... RENAME COLUMN old_name TO new_na me)。

用戶密碼可設置重試策略(Reuse Policy)。

移除PASSWORD()函數。這就意味着無法通過“SET PASSWORD ... = PASSWORD('a uth_string') ”命令修改用戶密碼。

代碼層移除Query Cache模塊,故Query Cache相關的變量和操作均不再支持。

BLOB, TEXT, GEOMETRY和JSON字段允許設置默認值。

可通過RESTART命令重啓MySQL實例。

需要注意的是,上面提到的發佈,一般指的是GA版本。

最後,看看下面這個表格,表中給出了最近幾個大版本的發佈時間,及截止到目前,其最新的小版本及其發佈時間。

版本 GA時間 最新的小版本 最新小版本的發佈時間 產品支持的結束時間
5.1 2008-11-14 5.7.13 2013-12-03 2013-12
5.5 2010-12-03 5.5.61 2018-07-27 2018-12
5.6 2013-02-05 5.6.41 2018-07-27 2021-02
5.7 2015-10-21 5.7.23 2018-07-27 2023-10
8.0 2018-04-19 8.0.12 2018-07-27 2026-04

從表中的數據來看,

  1. 大概每3年會發佈一個大的版本。

  2. 產品的支持週期一般是8年。

  3. 以爲MySQL 5.5是老古董了,但官方仍然在不斷更新。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章