- 默認字符集由latin1變?yōu)閡tf8mb4:
在8.0版本之前,默認字符集為latin1绩衷,utf8指向的是utf8mb3蹦魔,8.0版本默認字符集為utf8mb4,utf8默認指向的也是utf8mb4咳燕。在Percona Server 8.0.15版本上測試勿决,utf8仍然指向的是utf8mb3,與官方文檔有出入招盲。 - MyISAM系統(tǒng)表全部換成InnoDB表:
系統(tǒng)表全部換成事務(wù)型的innodb表低缩,默認的MySQL實例將不包含任何MyISAM表,除非手動創(chuàng)建MyISAM表曹货。 - 自增變量持久化:
在8.0之前的版本咆繁,自增主鍵AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重啟后控乾,會重置AUTO_INCREMENT=max(primary key)+1么介,這種現(xiàn)象在某些情況下會導(dǎo)致業(yè)務(wù)主鍵沖突或者其他難以發(fā)現(xiàn)的問題。自增主鍵重啟重置的問題很早就被發(fā)現(xiàn)(https://bugs.mysql.com/bug.php?id=199)蜕衡,一直到8.0才被解決壤短,8.0版本將會對AUTO_INCREMENT值進行持久化设拟,MySQL重啟后,該值將不會改變久脯。 - DDL原子化:
InnoDB表的DDL支持事務(wù)完整性纳胧,要么成功要么回滾,將DDL操作回滾日志寫入到data dictionary 數(shù)據(jù)字典表 mysql.innodb_ddl_log 中用于回滾操作帘撰,該表是隱藏的表跑慕,通過show tables無法看到。通過設(shè)置參數(shù)摧找,可將ddl操作日志打印輸出到mysql錯誤日志中核行。
mysql> set global log_error_verbosity=3;
mysql> set global innodb_print_ddl_logs=1;
mysql> create table t1(c int) engine=innodb;
來看另外一個例子,庫里只有一個t1表蹬耘,drop table t1,t2;
試圖刪除t1,t2兩張表,在5.7中芝雪,執(zhí)行報錯,但是t1表被刪除综苔,在8.0中執(zhí)行報錯惩系,但是t1表沒有被刪除,證明了8.0 DDL操作的原子性如筛,要么全部成功堡牡,要么回滾。
- 參數(shù)修改持久化:
MySQL 8.0版本支持在線修改全局參數(shù)并持久化杨刨,通過加上PERSIST
關(guān)鍵字晤柄,可以將修改的參數(shù)持久化到新的配置文件(mysqld-auto.cnf)中,重啟MySQL時拭嫁,可以從該配置文件獲取到最新的配置參數(shù)可免。
例如執(zhí)行:
set PERSIST expire_logs_days=10 ;
系統(tǒng)會在數(shù)據(jù)目錄下生成一個包含json格式的 mysqld-auto.cnf 的文件,格式化后如下所示做粤,當 my.cnf 和 mysqld-auto.cnf 同時存在時,后者具有更高優(yōu)先級捉撮。
- 新增降序索引:
MySQL在語法上很早就已經(jīng)支持降序索引怕品,但實際上創(chuàng)建的仍然是升序索引。 - group by 不再隱式排序:
mysql 8.0 對于group by 字段不再隱式排序巾遭,如需要排序肉康,必須顯式加上order by 子句。 - JSON特性增強:
MySQL 8 大幅改進了對 JSON 的支持灼舍,添加了基于路徑查詢參數(shù)從 JSON 字段中抽取數(shù)據(jù)的 JSON_EXTRACT() 函數(shù)吼和,以及用于將數(shù)據(jù)分別組合到 JSON 數(shù)組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數(shù)。
在主從復(fù)制中骑素,新增參數(shù) binlog_row_value_options炫乓,控制JSON數(shù)據(jù)的傳輸方式,允許對于Json類型部分修改,在binlog中只記錄修改的部分末捣,減少json大數(shù)據(jù)在只有少量修改的情況下侠姑,對資源的占用。 - redo & undo 日志加密:
增加以下兩個參數(shù)箩做,用于控制redo莽红、undo日志的加密。
innodb_undo_log_encrypt
innodb_undo_log_truncate
- innodb select for update跳過鎖等待:
select ... for update邦邦,select ... for share(8.0新增語法) 添加 NOWAIT安吁、SKIP LOCKED語法,跳過鎖等待燃辖,或者跳過鎖定柳畔。在5.7及之前的版本,select...for update郭赐,如果獲取不到鎖薪韩,會一直等待捌锭,直到innodb_lock_wait_timeout超時。
在8.0版本观谦,通過添加nowait拉盾,skip locked語法豁状,能夠立即返回。如果查詢的行已經(jīng)加鎖泻红,那么nowait會立即報錯返回,而skip locked也會立即返回谊路,只是返回的結(jié)果中不包含被鎖定的行讹躯。 - 增加SET_VAR語法:
在sql語法中增加SET_VAR語法缠劝,動態(tài)調(diào)整部分參數(shù),有利于提升語句性能惨恭。
SELECT /*+ SET_VAR(sort_buffer_size = 16M) */ id FROM test ORDER id ;
INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO test(NAME) VALUES(1);
- 支持不可見索引:
使用INVISIBLE關(guān)鍵字在創(chuàng)建表或者進行表變更中設(shè)置索引是否可見。索引不可見只是在查詢時優(yōu)化器不使用該索引脱羡,即使使用force index免都。優(yōu)化器也不會使用該索引,同時優(yōu)化器也不會報索引不存在的錯誤糊肤,因為索引仍然真實存在琴昆,在必要時,也可以快速的恢復(fù)成可見馆揉。
# 創(chuàng)建不可見索引
CREATE TABLE t2(c1 INT,c2 INT,INDEX idx_c1_c2(c1,c2 DESC) invisible );
# 索引可見
ALTER TABLE t2 ALTER INDEX idx_c1_c2 visible;
# 索引不可見
ALTER TABLE t2 ALTER INDEX idx_c1_c2 invisible;
新增innodb_dedicated_server參數(shù):
能夠讓InnoDB根據(jù)服務(wù)器上檢測到的內(nèi)存大小自動配置innodb_buffer_pool_size业舍,innodb_log_file_size,innodb_flush_method三個參數(shù)升酣。日志分類更詳細:
在錯誤信息中添加了錯誤信息編號[MY-010311]和錯誤所屬子系統(tǒng)[Server]undo空間自動回收:
innodb_undo_log_truncate參數(shù)在8.0.2版本默認值由OFF變?yōu)镺N舷暮,默認開啟undo日志表空間自動回收。
innodb_undo_tablespaces參數(shù)在8.0.2版本默認為2噩茄,當一個undo表空間被回收時下面,還有另外一個提供正常服務(wù)。
innodb_max_undo_log_size參數(shù)定義了undo表空間回收的最大值绩聘,當undo表空間超過這個值沥割,該表空間被標記為可回收。增加資源組:
MySQL 8.0新增了一個資源組功能凿菩,用于調(diào)控線程優(yōu)先級以及綁定CPU核机杜。MySQL用戶需要有 RESOURCE_GROUP_ADMIN權(quán)限才能創(chuàng)建、修改衅谷、刪除資源組椒拗。在Linux環(huán)境下,MySQL進程需要有CAP_SYS_NICE 權(quán)限才能使用資源組完整功能获黔。
默認提供兩個資源組蚀苛,分別是USR_default,SYS_default
創(chuàng)建資源組:
create resource group test_resouce_group type=USER vcpu=0,1 thread_priority=5;
將當前線程加入資源組:
SET RESOURCE GROUP test_resouce_group;
將某個線程加入資源組:
SET RESOURCE GROUP test_resouce_group FOR thread_id;
查看資源組里有哪些線程:
select * from Performance_Schema.threads where
RESOURCE_GROUP='test_resouce_group';
修改資源組:
alter resource group test_resouce_group vcpu = 2,3 THREAD_PRIORITY = 8;
刪除資源組 :
drop resource group test_resouce_group;
增加角色管理:
角色可以認為是一些權(quán)限的集合玷氏,為用戶賦予統(tǒng)一的角色堵未,權(quán)限的修改直接通過角色來進行,無需為每個用戶單獨授權(quán)预茄。MySQL8.0現(xiàn)在支持窗口函數(shù)(over)和公用表表達式(with)兴溜。毫無疑問,這是兩個最重要的Post-SQL-92功能耻陕。
-
8.0.12的優(yōu)化是,新增了一個算法 ALGORITHM=INSTANT刨沦,專門處理只需要修改元數(shù)據(jù)就可以完成的變更诗宣,這個就可以相對比較方便地直接使用了,不需要擔(dān)心從庫延遲想诅。
目前支持的操作是:- 添加新列召庞。已知限制條件如下:
不能與其他不支持INSTANT算法的alter子語句合并在一起岛心。
只能添加在表列的末尾。
不能用于innodb的壓縮表(ROW_FORMAT=COMPRESSED)篮灼。
目標表不能包含全文索引忘古。
目標表不能是臨時表。
目標表不能是數(shù)據(jù)字典表诅诱。
這種添加方式下髓堪,不會計算行長度是否合適,這個計算會在發(fā)生insert或者update的時候處理娘荡。 - 添加或者刪除虛擬列
- 添加或者去掉列的默認值干旁。
- 修改 enum争群,set 列類型的定義
- 修改索引類型
- 重命名表名稱
- 添加新列召庞。已知限制條件如下: