Mysql8.0&Mysql5.7&Mysql5.6&Mysql5.5特性對比

轉載來自:https://blog.csdn.net/liang_0609/article/details/77334959

Mysql5.5 特性,相對於Mysql5.1

性能提升

  1.     默認InnoDB plugin引擎。具有提交、回滾和crash恢復功能、ACID兼容。
  2.     行級鎖(一致性的非鎖定讀 MVCC)。
  3.     表與索引存儲在表空間、表大小無限制。
  4.     支持dynamic(primary key緩存內存 避免主鍵查詢引起的IO )與compressed(支持數據及索引壓縮)行格式。
  5.     InnoDB plugin文件格式Barracuda、支持表壓縮、節約存儲、提供內存命中率、truncate table速度更快。
  6.     原InnoDB只有一個UndoSegment,最多支持1023的併發;現在有128個Segments,支持128K個併發(同樣,解決高併發帶來的事務回滾)。
  7.     Innodb_thread_concurrency默認爲0,線程併發數無限制,可根據具體應用設置最佳值。
  8.     Innodb_io_capacity可以動態調整刷新髒頁的數量,改善大批量更新時刷新髒頁跟不上導致的性能下降問題。Default:200,跟硬盤的IOPS有關。
  9.     充分利用CPU多核處理能力innodb_read_io_threads閾值:1-64innodb_write_io_threads 閾值:1-64根據數據庫的讀寫比靈活設置,充分發揮多CPU、高性能存儲設備的性能,不支持動態加載 。
  10.     自適應刷新髒頁
  11.     熱數據存活更久
  12.     buffer pool多實例 :innodb_buffer_pool_instances 參數增加innodb_buffer_pool實例個數,大大降低buffer pool的mutex爭搶過熱情況。
  13.     Linux上實現異步IO
  14.     重新支持組提交

穩定性提升

  1.     支持半同步Replication。
  2.     增加Relay Log 自我修復功能。
  3.     Crash recovery。
  4.     引入紅-黑樹做插入排序的中間數據結構,時間複雜度大大降低,減少恢復時間。
  5.     Thread Pool 分組排隊 限流

Mysql5.6 特性,相比5.5

  1.     默認參數的改變
  2.     Back_log  排隊隊列
  3.     支持全文索引
  4.     支持online DDL create,alter,drop
  5.     可以在建表時指定表空間位置
  6.         create table external (x int unsigned not null primary key)data directory = '/volumes/external1/data';
  7.     新增參數innodb_page_size可以設置page大小
  8.     整合了memcached API,可以使用API來直接訪問innodb表,並非SQL(減少SQL解析、查詢優化代價)
  9.     innodb只讀事務,不需要設置TRX_ID字段,
  10.     減少內部數據結構開銷,減少read view
  11.     僅僅非只讀事務依然需要TRX_ID

innodb改進點

  1.     innodb表空間在線遷移(TransportableTablespaces)
  2.     undo log可獨立出系統表空間
  3.     redo log最大可增長到512G
  4.     innodb後臺線程獨立出來

優化器改進

    ICP

  •         可以在引擎層直接過濾數據,避免二次回表
  •         節省BP空間,提高查詢性能

    BKA

  •         全稱Batch Key Access:
  •         SQL通過輔助索引要訪問表數據時候,將大量的隨機訪問放入緩存,交給MRR接口合併爲順序訪問。

    MRR

  •         全稱Multi Range Read:
  •         在BKA算法應用之後,通過MRR接口合併隨機訪問爲順序訪問,再去檢索表數據。
  •         變大量隨機爲順序訪問。在通過輔助索引檢索大量數據時,性能提升明顯
  •         磁頭無需來回尋道,page只需讀取一次,且較好利用了innodb線性預讀功能(每次預讀64個連續page)。
  1.     統計信息持久化,mysqld重啓後不丟失
  2.     explain語句支持insert,update,delete,replace語句,並且支持JSON格式
  3.     子查詢優化提升。

Mysql5.7 特性,相比5.5 5.6

 安全性

  1.     用戶表 mysql.user 的 plugin字段不允許爲空, 默認值是 mysql_native_password,而不是 mysql_old_password,不再支持舊密碼格式;
  2.     增加密碼過期機制,過期後需要修改密碼,否則可能會被禁用,或者進入沙箱模式;
  3.     增加密碼過期機制,過期後需要修改密碼,否則可能會被禁用,或者進入沙箱模式;
  4.     提供了更爲簡單SSL安全訪問配置,並且默認連接就採用SSL的加密方式。

靈活性

  1.     MySQL數據庫從5.7.8版本開始,也提供了對JSON的支持。
  2.     可以混合存儲結構化數據和非結構化數據,同時擁有關係型數據庫和非關係型數據庫的優點
  3.     能夠提供完整的事務支持
  4.     generated column是MySQL 5.7引入的新特性,所謂generated column,就是數據庫中這一列由其他列計算而得

易用性

  1.     在MySQL 5.7 之前,如果用戶輸入了錯誤的SQL語句,按下 ctrl+c ,雖然能夠”結束”SQL語句的運行,但是,也會退出當前會話,MySQL 5.7對這一違反直覺的地方進行了改進,不再退出會話。
  2.     MySQL 5.7可以explain一個正在運行的SQL,這對於DBA分析運行時間較長的語句將會非常有用。
  3.     sys schema是MySQL 5.7.7中引入的一個系統庫,包含了一系列視圖、函數和存儲過程, 該項目專注於MySQL的易用性。
  4.     例如:如何查看數據庫中的冗餘索引;如何獲取未使用的索引;如何查看使用全表掃描的SQL語句。
  5. 可用性
  6.     在線設置 複製的過濾規則 不再需要重啓MySQL,只需要停止SQLthread,修改完成以後,啓動SQLthread。
  7.     在線修改buffer pool的大小。
  8.     Online DDL MySQL 5.7支持重命名索引和修改varchar的大小,這兩項操作在之前的版本中,都需要重建索引或表。
  9.     在線開啓GTID ,在之前的版本中,由於不支持在線開啓GTID,用戶如果希望將低版本的數據庫升級到支持GTID的數據庫版本,需要先關閉數據庫,再以GTID模式啓動,所以導致升級起來特別麻煩。

性能

  1.     臨時表的性能改進。
  •         臨時表只在當前會話中可見
  •         臨時表的生命週期是當前連接(MySQL宕機或重啓,則當前連接結束)
  1.     只讀事務性能改進。
  2.     MySQL 5.7通過 避免爲只讀事務分配事務ID ,不爲只讀事務分配回滾段,減少鎖競爭等多種方式,優化了只讀事務的開銷,提高了數據庫的整體性能。
  3.     加速連接處理。
  4.     在MySQL 5.7之前,變量的初始化操作(THD、VIO)都是在連接接收線程裏面完成的,現在將這些工作下發給工作線程,以減少連接接收線程的工作量,提高連接的處理速度。這個優化對那些頻繁建立短連接的應用,將會非常有用。
  5.     複製性能的改進 (支持多線程複製(Multi-Threaded Slaves, 簡稱MTS)
  6.     MySQL的默認配置是庫級別的並行複製,爲了充分發揮MySQL 5.7的並行複製的功能,我們需要將slave-parallel-type配置成LOGICAL_CLOCK。
  7.     支持多源複製(Multi-source replication)

嚴格性改變

  1.     默認啓用 STRICT_TRANS_TABLES 模式。
  2.     對 ONLY_FULL_GROUP_BY 模式實現了更復雜的特性支持,並且也被默認啓用。
  3.     其他被默認啓用的sql mode還有 NO_ENGINE_SUBSTITUTION。

默認參數的改變

  1.     默認binlog格式調整爲ROW格式

  2.     默認binlog錯誤後的操作調整爲ABORT_SERVER

  3.     在先前的選項下(binlog_error_action=IGNORE_ERROR),如果一個錯誤發生,導致無法寫入binlog,mysql-server會在錯誤日誌中記錄錯誤並強制關閉binlog功能。這會使mysql-server在不記錄binlog的模式下繼續運行,導致從庫無法繼續獲取到主庫的binlog。

  4.     默認開啓mysql崩潰時的binlog安全。

  5.     默認調低slave_net_timeout。

安裝不同

  1.     mysql_install_db已經不再推薦使用了,建議改成mysqld --initialize 完成實例初始化。如果 datadir 指向的目標目錄下已經有數據文件,則會有[ERROR] Aborting;
  2.     在初始化時如果加上 --initial-insecure,則會創建空密碼的 root@localhost 賬號,否則會創建帶密碼的 root@localhost 賬號,密碼直接寫在 log-error 日誌文件中;新用戶登入後需要立刻修改密碼,否則無法繼續後續的工作。

Mysql8.0 特性,相比5.7

新的系統字典表

    整合了存儲有關數據庫對象信息的事務數據字典,所有的元數據都用InnoDB引擎進行存儲

安全和用戶管理

  1.     新增caching_sha2_password認證插件,並且是默認的身份認證插件。性能和安全方面加強
  2.     權限支持role
  3.     新增密碼歷史記錄功能,限制重複使用以前的密碼

 innodb 增強

  1.     新增INFORMATION_SCHEMA.INNODB_CACHED_INDEXES,查看每個索引緩存在InnoDB緩衝池中的索引頁數
  2.     InnoDB臨時表都將在共享臨時表空間ibtmp1中創建
  3.     對於SELECT ... FOR SHARE和SELECT ... FOR UPDATE語句,InnoDB支持NOWAIT和SKIP LOCKED
  4.     innodb_undo_tablespaces的最小值爲2,並且不再允許將innodb_undo_tablespaces設置爲0。 最小值2確保回滾段始終在撤消表空間中創建,而不是在系統表空間中創建
  5.     支持 ALTER TABLESPACE ... RENAME TO 語法
  6.     新增INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF視圖
  7.     新增了動態配置項 innodb_deadlock_detect,用來禁用死鎖檢查,因爲在高併發系統中,當大量線程等待同一個鎖時,死鎖檢查會大大拖慢數據庫
  8.     支持使用innodb_directories選項在服務器脫機時將表空間文件移動或恢復到新位置
  9.     新增innodb_dedicated_server,讓InnoDB根據服務器上檢測到的內存量自動配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method。當innodb_dedicated_server啓用時,InnoDB根據服務器上檢測到的內存量自動配置以下選項:
  10.     innodb_dedicated_server:自動配置緩衝池大小

    

檢測到的服務器內存 緩衝池大小
<1G  128M(在innodb_buffer_pool_size 默認設)
<= 4G 檢測到的服務器存儲器* 0.5
> 4G 檢測到的服務器內存* 0.75
  1.     innodb_log_file_size:自動配置的日誌文件大小
檢測到的服務器內存 日誌文件的大小
<1GB 48M(在innodb_log_file_size 默認設置)
<= 4GB 128M

<= 8GB

512M
<= 16GB 1024M
> 16GB 2048M

 

  1.     innodb_flush_method:O_DIRECT_NO_FSYNC

MySQL 8.0更好支持文檔型數據庫和JSON

    不可見索引,開始支持invisible index,在優化SQL的過程中可以設置索引爲不可見,優化器不會利用不可見索引
    支持降序索引,可以對索引定義 DESC,之前,索引可以被反序掃描,但影響性能,而降序索引就可以高效的完成
    支持RANK(), LAG()、NTILE()等函數
    正則表達式增強,提供了REGEXP_LIKE(),EGEXP_INSTR(), REGEXP_REPLACE(), REGEXP_SUBSTR()等函數  
    新增備份鎖,允許在線備份期間的DML,同時防止可能導致快照不一致的操作。 備份鎖由LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE語法支持
    默認字符集由latin1變爲utf8mb4

配置文件增強

    MySQL 8.0版本支持在線修改全局參數持久化,通過加上PERSIST關鍵字,可以將調整持久化到新的配置文件中,再次重啓db還可以應用到最新的參數。對於加上 PERSIST 關鍵字修改參數命令,MySQL系統會生成一個包含json格式數據的 mysqld-auto.cnf 文件,比如執行:
    set PERSIST  binlog_expire_logs_seconds = 604800 ; #內存和json文件都修改,重啓還生效
    set GLOBAL  binlog_expire_logs_seconds = 604800 ; #只修改內存,重啓丟失
    系統會在數據目錄下生成一個包含如下內容的 mysqld-auto.cnf 的文件:
    { "mysql_server": {" binlog_expire_logs_seconds ": "604800" } }
    當 my.cnf 和 mysqld-auto.cnf 同時存在時,後者具有高優先級。

直方圖

    MySQL 8.0 版本開始支持期待已久直方圖。優化器會利用column_statistics的數據,判斷字段的值的分佈,得到更準確的執行計劃。
    可以使用 ANALYZE TABLE table_name [UPDATE HISTOGRAM on col_name with N BUCKETS |DROP HISTOGRAM ON  clo_name] 來收集或者刪除直方圖信息

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

    select /*+ SET_VAR(sort_buffer_size = 16M) */ id  from test order id ;
    insert  /*+ SET_VAR(foreign_key_checks=OFF) */ into test(name) values(1);

InnoDB性能提升

    廢除buffer pool mutex, 將原來一個mutex拆分成多個,提高併發拆分LOCK_thd_list 和 LOCK_thd_remove 這兩個mutex,大約可提高線程鏈接效率5%。

行緩存

    MySQL8.0的優化器可以估算將要讀取的行數,因此可以提供給存儲引擎一個合適大小的row buffer來存儲需要的數據。大批量的連續數據掃描的性能將受益於更大的record buffer。

改進掃描性能

    改進InnoDB範圍查詢的性能,可提升全表查詢和範圍查詢 5-20%的性能。

成本模型

    InnoDB緩衝區可以估算緩存區中的有多少表和索引,這可以讓優化器選擇訪問方式時知道數據是否可以存儲在內存中還是必須存儲到磁盤上。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章