myql-各版本特性

4.1

2002年發佈的4.0 Beta版,至此MySQL終於蛻變成一個成熟的關係型數據庫系統。
2002年mysql4.1版本增加了子查詢的支持,
字符集增加UTF-8,
GROUP BY語句增加了ROLLUP,
MySQL.user表採用了更好的加密算法。
支持每個innodb引擎的表單獨放到一個表空間裏。innodb通過使用MVCC(多版本併發控制)來獲取高併發性,並且實現sql標準的4種隔離級別,同時使用一種被稱成next-key locking的策略來避免幻讀(phantom)現象。
除此之外innodb引擎還提供了插入緩存(insert buffer)、二次寫(double write)、自適應哈西索引(adaptive hash index)、預讀(read ahead)等高性能技術。

5.0

mysql-5.0版本之前,myisam默認支持的表大小爲4G。
從mysql-5.0以後,myisam默認支持256T的表單數據。
myisam只緩存索引數據。
加入了存儲過程、服務器端遊標、觸發器、視圖、分佈式事務(Xa transactions)、查詢優化器的顯著改進以及其他的一些特性

5.1

20o8年發佈的MySQL 5.1 的版本,基本上就是一個增加了崩潰恢復功能的MyISAM,使用表級鎖,但可以做到讀寫不衝突,即在進行任何類型的更新操作的同時都可以進行讀操作,但多個寫操作不能併發

5.5

2010年12月發佈mysql5.5版本默認存儲引擎更改爲InnoDB 多個回滾段(Multiple Rollback Segments)
,之前的innodb版本最大能處理1023個併發處理操作,
現在mysql5.5可以處理高達128K的併發事物 改善事務處理中的元數據鎖定。例如,事物中一個語句需要鎖一個表,會在事物結束時釋放這個表,而不是像以前在語句結束時釋放表。
增加了INFORMATION_SCHEMA表,新的表提供了與InnoDB壓縮和事務處理鎖定有關的具體信息。
默認InnoDB plugin引擎。具有提交、回滾和crash恢復功能、ACID兼容
行級鎖(一致性的非鎖定讀 MVCC)
表與索引存儲在表空間、表大小無限制
支持dynamic(primary key緩存內存 避免主鍵查詢引起的IO )與compressed(支持數據及索引壓縮)行格式
InnoDB plugin文件格式Barracuda、支持表壓縮、節約存儲、提供內存命中率、truncate table速度更快
原InnoDB只有一個UndoSegment,最多支持1023的併發;現在有128個Segments,支持128K個併發(同樣,解決高併發帶來的事務回滾)
Innodb_thread_concurrency默認爲0,線程併發數無限制,可根據具體應用設置最佳值
Innodb_io_capacity可以動態調整刷新髒頁的數量,改善大批量更新時刷新髒頁跟不上導致的性能下降問題。Default:200,跟硬盤的IOPS有關
充分利用CPU多核處理能力innodb_read_io_threads閾值:1-64innodb_write_io_threads 閾值:1-64根據數據庫的讀寫比靈活設置,充分發揮多CPU、高性能儲設備的性能,不支持動態加載
自適應刷新髒頁
熱數據存活更久
buffer pool多實例:innodb_buffer_pool_instances 參數增加innodb_buffer_pool實例個數,大大降低buffer pool的mutex爭搶過熱情況
Linux上實現異步IO
重新支持組提交
穩定性提升
支持半同步Replication
增加Relay Log 自我修復功能
Crash recovery
引入紅-黑樹做插入排序的中間數據結構,時間複雜度大大降低,減少恢復時間
Thread Pool 分組排隊限流

5.6

2013年2月發佈,mysql5.6版本其中InnoDB可以限制大量表打開的時候內存佔用過多的問題InnoDB性能加強。如大內存優化等InnoDB死鎖信息可以記錄到 error 日誌,
方便分析InnoDB提供全文索引能力
默認參數的改變
Back_log排隊隊列
支持全文索引
支持online DDL create,alter,drop
可以在建表時指定表空間位置
create table external (x int unsigned not null primary key)data directory = ‘/volumes/external1/data’;
新增參數innodb_page_size可以設置page大小
整合了memcached API,可以使用API來直接訪問innodb表,並非SQL(減少SQL解析、查詢優化代價)
innodb只讀事務,不需要設置TRX_ID字段
減少內部數據結構開銷,減少read view
僅僅非只讀事務依然需要TRX_ID
innodb改進
innodb表空間在線遷移(TransportableTablespaces)
undo log可獨立出系統表空間
redo log最大可增長到512G
innodb後臺線程獨立出來
優化器改進
ICP
可以在引擎層直接過濾數據,避免二次回表節省BP空間,提高查詢性能
BKA, 全稱Batch Key Access
SQL通過輔助索引要訪問表數據時候,將大量的隨機訪問放入緩存,交給MRR接口合併爲順序訪問
MRR,全稱Multi Range Read
在BKA算法應用之後,通過MRR接口合併隨機訪問爲順序訪問,再去檢索表數據。變大量隨機爲順序訪問。在通過輔助索引檢索大量數據時,性能提升明顯磁頭無需來回尋道,page只需讀取一次,且較好利用了innodb線性預讀功能(每次預讀64個連續page)
統計信息持久化,mysqld重啓後不丟失

explain語句支持insert,update,delete,replace語句,並且支持JSON格式
子查詢優化提升

5.7

2015年發佈,mysql5.7查詢性能得以大幅提升,比 MySQL 5.6 提升 1 倍,降低了建立數據庫連接的時間

安裝不同
mysql_install_db已經不再推薦使用了,建議改成mysqld –initialize 完成實例初始化。如果 datadir 指向的目標目錄下已經有數據文件,則會有[ERROR] Aborting
在初始化時如果加上 –initial-insecure,則會創建空密碼的 root@localhost 賬號,否則會創建帶密碼的 root@localhost 賬號,密碼直接寫在 log-error 日誌文件中;新用戶登入後需要立刻修改密碼,否則無法繼續後續的工作
*
安全性
用戶表 mysql.user 的 plugin字段不允許爲空, 默認值是 mysql_native_password,而不是 mysql_old_password,不再支持舊密碼格式
增加密碼過期機制,過期後需要修改密碼,否則可能會被禁用,或者進入沙箱模式
提供了更爲簡單SSL安全訪問配置,並且默認連接就採用SSL的加密方式。

靈活性
MySQL數據庫從5.7.8版本開始,也提供了對JSON的支持
可以混合存儲結構化數據和非結構化數據,同時擁有關係型數據庫和非關係型數據庫的優點
能夠提供完整的事務支持
generated column是MySQL 5.7引入的新特性,所謂generated column,就是數據庫中這一列由其他列計算而得
在MySQL 5.7 之前,如果用戶輸入了錯誤的SQL語句,按下 ctrl+c ,雖然能夠”結束”SQL語句的運行,但是,也會退出當前會話,MySQL 5.7對這一違反直覺的地方進行了改進,不再退出會話
MySQL 5.7可以explain一個正在運行的SQL,這對於DBA分析運行時間較長的語句將會非常有用
sys schema是MySQL 5.7.7中引入的一個系統庫,包含了一系列視圖、函數和存儲過程, 該項目專注於MySQL的易用性
例如:如何查看數據庫中的冗餘索引;如何獲取未使用的索引;如何查看使用全表掃描的SQL語句

可用性
在線設置 複製的過濾規則 不再需要重啓MySQL,只需要停止SQLthread,修改完成以後,啓動SQLthread
在線修改buffer pool的大小
Online DDL MySQL 5.7支持重命名索引和修改varchar的大小,這兩項操作在之前的版本中,都需要重建索引或表
在線開啓GTID ,在之前的版本中,由於不支持在線開啓GTID,用戶如果希望將低版本的數據庫升級到支持GTID的數據庫版本,需要先關閉數據庫,再以GTID模式啓動,所以導致升級起來特別麻煩

性能
臨時表只在當前會話中可見,臨時表的生命週期是當前連接(MySQL宕機或重啓,則當前連接結束)

只讀事務性能改進
避免爲只讀事務分配事務ID ,不爲只讀事務分配回滾段,減少鎖競爭等多種方式,優化了只讀事務的開銷,提高了數據庫的整體性能

加速連接處理
在MySQL 5.7之前,變量的初始化操作(THD、VIO)都是在連接接收線程裏面完成的,現在將這些工作下發給工作線程,以減少連接接收線程的工作量,提高連接的處理速度。這個優化對那些頻繁建立短連接的應用,將會非常有用

制性能的改進(支持多線程複製(Multi-Threaded Slaves, 簡稱MTS)
MySQL的默認配置是庫級別的並行複製,爲了充分發揮MySQL 5.7的並行複製的功能,我們需要將slave-parallel-type配置成LOGICAL_CLOCK
支持多源複製(Multi-source replication)

嚴格性改變
默認啓用 STRICT_TRANS_TABLES 模式
對 ONLY_FULL_GROUP_BY 模式實現了更復雜的特性支持,並且也被默認啓用
其他被默認啓用的sql mode還有 NO_ENGINE_SUBSTITUTION

默認參數的改變
默認binlog格式調整爲ROW格式
默認binlog錯誤後的操作調整爲ABORT_SERVER
在先前的選項下(binlog_error_action=IGNORE_ERROR),如果一個錯誤發生,導致無法寫入binlog,mysql-server會在錯誤日誌中記錄錯誤並強制關閉binlog功能。這會使mysql-server在不記錄binlog的模式下繼續運行,導致從庫無法繼續獲取到主庫的binlog
默認開啓mysql崩潰時的binlog安全
默認調低slave_net_timeout

8.0.11

性能
MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭(”hot spot”熱點競爭問題)工作負載

NoSQL
MySQL 從 5.7 版本開始提供 NoSQL 存儲功能,目前在 8.0 版本中這部分功能也得到了更大的改進。該項功能消除了對獨立的 NoSQL 文檔數據庫的需求,而 MySQL 文檔存儲也爲 schema-less 模式的 JSON 文檔提供了多文檔事務支持和完整的 ACID 合規性

窗口函數(Window Functions)
從 MySQL 8.0 開始,新增了一個叫窗口函數的概念,它可以用來實現若干新的查詢方式。窗口函數與 SUM()、COUNT() 這種集合函數類似,但它不會將多行查詢結果合併爲一行,而是將結果放回多行當中。即窗口函數不需要 GROUP BY

隱藏索引
在 MySQL 8.0 中,索引可以被“隱藏”和“顯示”。當對索引進行隱藏時,它不會被查詢優化器所使用。我們可以使用這個特性用於性能調試,例如我們先隱藏一個索引,然後觀察其對數據庫的影響。如果數據庫性能有所下降,說明這個索引是有用的,然後將其“恢復顯示”即可;如果數據庫性能看不出變化,說明這個索引是多餘的,可以考慮刪掉
開始支持invisible index,在優化SQL的過程中可以設置索引爲不可見,MySQL優化器便不會利用不可見索引。我們可以通過隱藏該索引,來觀察對數據庫性能的影響,好的話就留下,不好就刪除。
用法:alter table t alter index column_idx invisible;

降序索引
MySQL 8.0 爲索引提供按降序方式進行排序的支持,在這種索引中的值也會按降序的方式進行排序通用表表達式(Common Table Expressions CTE)在複雜的查詢中使用嵌入式表時,使用 CTE 使得查詢語句更清晰

字符集
從 MySQL8.0 開始,數據庫的缺省編碼將改爲 utf8mb4,這個編碼包含了所有 emoji 字符

JSON
MySQL 8 大幅改進了對 JSON 的支持,添加了基於路徑查詢參數從 JSON 字段中抽取數據的 JSON_EXTRACT() 函數,以及用於將數據分別組合到 JSON 數組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數

可靠性
InnoDB 現在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以實現事務完整性,要麼失敗回滾,要麼成功提交,不至於出現 DDL 時部分成功的問題,此外還支持 crash-safe 特性,元數據存儲在單個事務數據字典中

高可用性(High Availability)
InnoDB 集羣爲您的數據庫提供集成的原生 HA 解決方案

安全性
對 OpenSSL 的改進、新的默認身份驗證、SQL 角色、密碼強度、授權

新增了事務類型的數據字典,所有的元數據信息,都用InnoDB存
儲引擎進行存儲。

可以使用角色可以方便地對用戶權限進行管理

新增了SET PERSIST 命令 MySQL 會將該命令的配置保存到數據目錄下的 mysqld-auto.cnf 文件中,下次啓動時會讀取該文件,用其中的配置來覆蓋缺省的配置文件。

支持DDL 原子操作
InnoDB表的DDL支持事務完整性,要麼成功要麼回滾,將DDL操作回滾日誌寫入到data dictionary 數據字典表 mysql.innodb_ddl_log 中用於回滾操作

直方圖的引入
MySQL 8.0 版本開始支持期待已久直方圖。優化器會利用存儲在I_S的column_statistics的數據,判斷字段的值的分佈,得到更準確的執行計劃。
用法:ANALYZE TABLE table_name [UPDATE HISTOGRAM|DROP HISTOGRAM]

.支持會話級別SET_VAR 動態調整部分參數,有利於提升語句性能

select /*+ SET_VAR(sort_buffer_size = 16M) */ name from people order y name; 
insert /*+ SET_VAR(foreign_key_checks=OFF) */ into t2 values(2);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章