mysql是一個開放源碼的小型關聯式數據庫管理系統,開發者為瑞典mysql ab公司。目前mysql被廣泛地應用在internet上的中小型網站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了mysql作為網站數據庫。
MySQL開發團隊于12日宣布MySQL 8.0.0開發里程碑版本(DMR)發布!可能有人會驚奇MySQL為何從5.x一下跳躍到了8.0。事實上,MySQL 5.x系列已經延續了很多年,從被Oracle收購之前就是5.1,而收購之后一直維持在5.x,比如5.5,5.6,5.7等等。其實,如果按照原本的發布節奏,可以把5.6.x當成6.x,5.7.x當成7.x。所以,只是換了版本命名方式而已。
不過這次發布的MySQL 8.0.0開發版本還是有不少亮點的。
MySQL 8.0.0亮點
事務性數據字典,完全脫離了MyISAM存儲引擎
真正將數據字典放到了InnoDB中的一些表中,從此不再需要FRM、TRG、PAR文件啦!Information Schema現在以數據字典表的一個視圖出現。原則上可以完全不需要MyISAM數據表類型了,所有的系統表都可以放到InnoDB之中。
SQL角色
角色是一系列權限的集合。可以創建角色,給某個用戶授予和去除角色。這對于權限管理很方便。
utf8mb4字符集將成為默認字符集,并支持Unicode 9
默認字符集將從?latin1?改為?utf8mb4,默認定序collation將從latin1_swedish_ci?改為?utf8mb4_800_ci_ai。
不可見索引
可以將一些索引設置為不可見,這樣SQL優化器就不會用到它,但是它會繼續在后臺保持更新。當有需要時,可以隨時恢復可見。
對二進制數據可以進行位操作
不僅僅可以對?BIGINT進行位操作,從8.0開始也支持對?[VAR]BINARY/[TINY|MEDIUM|LONG]BLOB進行位操作了。
改進了對IPv6和UUID的操作
INET6_ATON()?和?INET6_NTOA()?現在可以進行位操作了,因為INET6_ATON()現在返回的是VARBINARY(16)?數據類型(128位)。改進了UUID操作,引入了三個新的函數?UUID_TO_BIN(),?BIN_TO_UUID()和?IS_UUID()?。MySQL并沒有特殊的IPv6和UUID數據類型,而是以VARBINARY(16)?數據類型保存的。
持續性的全局變量
可以用?SET PERSIST?來設置持久性的全局變量,即便服務器重啟也會保持下來。
性能數據庫Performance Schema的改進
比如對性能數據庫增加了100多個索引,可以檢索更快。
重構SQL分析器
持續不斷的逐步改進SQL分析器。舊的分析器由于其語法復雜性和自頂向下的分析方式從而有嚴重的限制,導致難以維護和擴展。
成本模型
InnoDB緩沖區現在可以估算主內存緩存區中的有多少表和索引,這可以讓優化器選擇訪問方式時知道數據是否可以存儲在內存中還是必須存儲到磁盤上。
直方圖Histograms
通過使用直方圖,用戶或DBA可以對數據分布進行統計,這可以用于查詢優化以尋找優化的查詢方案。
改進掃描性能
改進了InnoDB范圍查詢的性能,可提升全表查詢和范圍查詢?5-20%的性能。
重構BLOB
重構BLOB加速了片段讀取/更新操作,可以加速JSON數據的操作。
持久化自增值
InnoDB會持久化保持自增序列的最大值到redo日志中。這個改進還修復了一個非常老的199號bug。
臨時表
取消對壓縮臨時表的支持,并存儲臨時表的元數據到內存中。
其它的更多重要改進和細節,請參考MySQL 8.0.0?發布公告[1]和這里[2]。
下載
目前8.0.0還是開發版本,如果你希望體驗和測試最新特性,可以從?dev.mysql.com[3]?下載各個平臺的安裝包。不過,MySQL軟件包是越來越大了,Linux平臺上的二進制打包后就將近有1 GB。如果在產品環境中使用,在8.0沒有進入穩定版本之前,請繼續使用5.7系列,當前最新的版本是5.7.15 GA版本——這只有600 M多。
最新的源代碼放在?GitHub?上,感興趣的朋友可以去看看,其中有不少是中國人的貢獻。
從MySQL8.0開始支持隱藏索引特性,也就是所謂的invisible index。對于不可見的索引,優化器將直接忽略掉。我們可以通過該特性來影響優化器的行為。另外這也可以視為在drop一個索引之前的緩沖,臨時把索引設置為不可見后,再觀察應用是否正常或有報錯什么的,如果一切OK,再最終刪除。
對應的8.0.0的release note:
測試
#?創建一個普通的表t1,只帶主鍵 mysql>?create?table?t1?(a?int?primary?key?auto_increment,?b?int,?c?int,?d?int); Query?OK,?0?rows?affected?(0.67?sec) #?增加一個索引 mysql>?alter?table?t1?add?key(b); Query?OK,?0?rows?affected?(0.06?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?show?indexes?from?t1G ***************************?1.?row?*************************** ????????Table:?t1 ???Non_unique:?0 ?????Key_name:?PRIMARY ?Seq_in_index:?1 ??Column_name:?a ????Collation:?A ??Cardinality:?0 ?????Sub_part:?NULL ???????Packed:?NULL ?????????Null: ???Index_type:?BTREE ??????Comment: Index_comment: ??????Visible:?YES ***************************?2.?row?*************************** ????????Table:?t1 ???Non_unique:?1 ?????Key_name:?b ?Seq_in_index:?1 ??Column_name:?b ????Collation:?A ??Cardinality:?0 ?????Sub_part:?NULL ???????Packed:?NULL ?????????Null:?YES ???Index_type:?BTREE ??????Comment: Index_comment: ??????Visible:?YES 2?rows?in?set?(0.01?sec) 從show?indexes的visible列顯示了,這兩個索引都是可見的。 #?Load?some?data insert?into?t1?select?NULL,?rand()*100000,?rand()*10000,rand()*10000; insert?into?t1?select?NULL,?rand()*100000,?rand()*10000,rand()*10000?from?t1; insert?into?t1?select?NULL,?rand()*100000,?rand()*10000,rand()*10000?from?t1; .... analyze?table?t1; mysql>?explain?select?*?from?t1?where?b?>?5000?limit?10; +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ |?id?|?select_type?|?table?|?partitions?|?type??|?possible_keys?|?key??|?key_len?|?ref??|?rows?|?filtered?|?Extra????????????| +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ |??1?|?SIMPLE?????|?t1???|?NULL?????|?range?|?b?????????|?b???|?5?????|?NULL?|?1932?|???100.00|?Using?index?condition?| +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ 1?row?in?set,?1?warning?(0.00?sec 可以看到索引b被使用到 #?修改索引b為不可見 mysql>?alter?table?t1?alter?index?b?invisible; Query?OK,?0?rows?affected?(0.05?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?show?indexes?from?t1G ***************************?1.?row?*************************** ????????Table:?t1 ???Non_unique:?0 ?????Key_name:?PRIMARY ?Seq_in_index:?1 ??Column_name:?a ????Collation:?A ??Cardinality:?2048 ?????Sub_part:?NULL ???????Packed:?NULL ?????????Null: ???Index_type:?BTREE ??????Comment: Index_comment: ??????Visible:?YES ***************************?2.?row?*************************** ????????Table:?t1 ???Non_unique:?1 ?????Key_name:?b ?Seq_in_index:?1 ??Column_name:?b ????Collation:?A ??Cardinality:?2029 ?????Sub_part:?NULL ???????Packed:?NULL ?????????Null:?YES ???Index_type:?BTREE ??????Comment: Index_comment: ??????Visible:?NO 2?rows?in?set?(0.01?sec) mysql>?explain?select?*?from?t1?where?b?>?5000?limit?10G ***************************?1.?row?*************************** ???????????id:?1 ??select_type:?SIMPLE ????????table:?t1 ???partitions:?NULL ?????????type:?ALL possible_keys:?NULL ??????????key:?NULL ??????key_len:?NULL ??????????ref:?NULL ?????????rows:?2048 ?????filtered:?33.33 ????????Extra:?Using?where 1?row?in?set,?1?warning?(0.00?sec) 當索引被修改為invisible后,優化器將不再選擇這個索引 #?將索引重新修改為可見 mysql>?alter?table?t1?alter?index?b?visible; Query?OK,?0?rows?affected?(0.05?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?explain?select?*?from?t1?where?b?>?5000?limit?10G ***************************?1.?row?*************************** ???????????id:?1 ??select_type:?SIMPLE ????????table:?t1 ???partitions:?NULL ?????????type:?range possible_keys:?b ??????????key:?b ??????key_len:?5 ??????????ref:?NULL ?????????rows:?1932 ?????filtered:?100.00 ????????Extra:?Using?index?condition 1?row?in?set,?1?warning?(0.00?sec) #?你也可以在創建索引的時候顯式指定是否可見 mysql>?alter?table?t1?add?key(c)?invisible; Query?OK,?0?rows?affected?(0.12?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?show?indexes?from?t1?where?key_name?=?'c'G ***************************?1.?row?*************************** ????????Table:?t1 ???Non_unique:?1 ?????Key_name:?c ?Seq_in_index:?1 ??Column_name:?c ????Collation:?A ??Cardinality:?1848 ?????Sub_part:?NULL ???????Packed:?NULL ?????????Null:?YES ???Index_type:?BTREE ??????Comment: Index_comment: ??????Visible:?NO 1?row?in?set?(0.01?sec) #?或者在建表時指定關鍵字 mysql>?create?table?t2?(a?int?primary?key,?b?int,?key(b)?invisible); Query?OK,?0?rows?affected?(0.67?sec) #?但primary?key不可以設置為不可見 mysql>?drop?table?t2; Query?OK,?0?rows?affected?(0.03?sec) mysql>?create?table?t2?(a?int,?b?int,?primary?key(a)?invisible); ERROR?3522?(HY000):?A?primary?key?index?cannot?be?invisible