溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中innodb新特性有哪些

發(fā)布時間:2021-11-06 08:57:03 來源:億速云 閱讀:221 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹了MySQL中innodb新特性有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。


4.1 innodb buffer dump 功能增強     
      5.7.5 新增加innodb_buffer_pool_dump_pct參數(shù),來控制每個innodb buffer中轉(zhuǎn)儲活躍使用的innodb buffer pages的比例。之前的版本默認值是100%,當(dāng)觸發(fā)轉(zhuǎn)儲的時候 會全量dump innodb buffer pool中的pages。如果啟用新的參數(shù)比如40 ,每個innodb buffer pool instance中有100個 ,每次轉(zhuǎn)儲每個innodb buffer 實例中的40個pages。
    注意:當(dāng)innodb發(fā)現(xiàn)innodb 后臺io資源緊張時,會主動降低該參數(shù)設(shè)置的比例。

4.2 支持多線程刷臟頁  
      MySQL 5.6.2版本中,MySQL將刷臟頁的線程從master線程獨立出來,5.7.4版本之后,MySQL系統(tǒng)支持多線程刷臟頁,進程的數(shù)量由innodb_page_cleaners參數(shù)控制,該參數(shù)不能動態(tài)修改,最小值為1 ,最大值支持64,5.7.7以及之前默認值是1 ,5.7.8版本之后修改默認參數(shù)為4。當(dāng)啟用多線程刷臟也,系統(tǒng)將刷新innodb buffer instance臟頁分配到各個空閑的刷臟頁的線程上,如果設(shè)置的innodb_page_cleaners>innodb_buffer_pool_instances,系統(tǒng)會自動重置為innodb_buffer_pool_instances大小。

4.3 動態(tài)調(diào)整 innodb buffer size
    從5.7.5版本, MySQL支持在不重啟系統(tǒng)的情況下動態(tài)調(diào)整innodb_buffer_pool_size。resize的過程是以chunk(每個chunk的大小默認為128M)的為單位遷移pages到新的內(nèi)存空間,遷移進度可以通過Innodb_buffer_pool_resize_status 查看。記住整個resize的大小是以chunk為單位的。innodb_buffer_pool_chunk_size的大小,計算公式是innodb_buffer_pool_size / innodb_buffer_pool_instances,新調(diào)整的值必須是 innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances的整數(shù)倍。如果不是整數(shù)倍,則系統(tǒng)則會調(diào)整值為大于兩者乘積的最大值。 
例子

  1. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

  2. +----------------------------------+----------------------------------------------------------------------+

  3. | Variable_name | Value |

  4. +----------------------------------+----------------------------------------------------------------------+

  5. | Innodb_buffer_pool_resize_status | Size did not change (old size = new size = 268435456. Nothing to do. |

  6. +----------------------------------+----------------------------------------------------------------------+

  7. 1 row in set (0.00 sec)

  8. mysql> set global innodb_buffer_pool_size=128*1024*1024;

  9. Query OK, 0 rows affected (0.00 sec)

  10. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

  11. +----------------------------------+----------------------------------------------------+

  12. | Variable_name | Value |

  13. +----------------------------------+----------------------------------------------------+

  14. | Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 160702 23:53:51. |

  15. +----------------------------------+----------------------------------------------------+

  16. 1 row in set (0.00 sec)

  17. mysql> set global innodb_buffer_pool_size=256*1024*1024;

  18. Query OK, 0 rows affected (0.00 sec)

  19. mysql> SHOW STATUS WHERE Variable_name='InnoDB_buffer_pool_resize_status';

  20. +----------------------------------+----------------------------------------------------+

  21. | Variable_name | Value |

  22. +----------------------------------+----------------------------------------------------+

  23. | Innodb_buffer_pool_resize_status | Completed resizing buffer pool at 160702 23:54:19. |

  24. +----------------------------------+----------------------------------------------------+

  25. 1 row in set (0.00 sec)

online調(diào)整bp size的log 記錄大致過程 
a 計算要調(diào)整的bpsize
b 禁止AHI,清理所有的索引緩存
c Withdrawing block是遍歷freelist 確定可以使用的空閑block
d 鎖住整個buffer pool 
e 遷移重新分配chunk/刪除可以釋放的chunk 
f 設(shè)置innodb_buffer_pool_size為新的值
g 重新開啟AHI 

  1. 2016-07-02T15:40:44.724495Z 0 [Note] InnoDB: Resizing buffer pool from 134217728 to 268435456 (unit=134217728).

  2. 2016-07-02T15:40:44.724546Z 2 [Note] InnoDB: Resizing buffer pool from 134217 (new size: 268435456 bytes)

  3. 2016-07-02T15:40:44.724559Z 0 [Note] InnoDB: Disabling adaptive hash index.

  4. 2016-07-02T15:40:44.724979Z 0 [Note] InnoDB: disabled adaptive hash index.

  5. 2016-07-02T15:40:44.725029Z 0 [Note] InnoDB: Withdrawing blocks to be shrunken.

  6. 2016-07-02T15:40:44.725040Z 0 [Note] InnoDB: Latching whole of buffer pool.

  7. 2016-07-02T15:40:44.725210Z 0 [Note] InnoDB: buffer pool 0 : resizing with chunks 1 to 2.

  8. 2016-07-02T15:40:44.735439Z 0 [Note] InnoDB: buffer pool 0 : 1 chunks (8192 blocks) were added.

  9. 2016-07-02T15:40:44.735511Z 0 [Note] InnoDB: Completed to resize buffer pool from 134217728 to 268435456.

  10. 2016-07-02T15:40:44.735561Z 0 [Note] InnoDB: Re-enabled adaptive hash index.

  11. 2016-07-02T15:40:44.735586Z 0 [Note] InnoDB: Completed resizing buffer pool at 160702 23:40:44.

這個特性是最令眾多MySQL DBA 期待的特性之一。以后線上動態(tài)擴容,縮容就無需做數(shù)據(jù)庫切換了,間接增強了系統(tǒng)的穩(wěn)定性和DBA的生活幸福感。當(dāng)然本文中介紹的略顯粗略。
4.4 支持全局表空間 
     全局表空間可以被所有的數(shù)據(jù)庫的表共享,而且相比于 file-per-table tablespaces. 使用共享表空間可以節(jié)約元數(shù)據(jù)方面的內(nèi)存。(需要更深入的了解共享表空間 主要是大小 收縮問題) 

  1. mysql> CREATE TABLESPACE `youzan_com`

  2.     -> ADD DATAFILE 'youzan_com.ibd' FILE_BLOCK_SIZE = 16k;

  3. Query OK, 0 rows affected (0.02 sec)

  4. mysql> use yang

  5. Database changed

  6. mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8  TABLESPACE youzan_com ;

  7. Query OK, 0 rows affected (0.04 sec)

  8. mysql> create database youzan default charset utf8;

  9. Query OK, 1 row affected (0.02 sec)

  10. mysql> use youzan

  11. Database changed

  12. mysql>

  13. mysql> create table yztb(id int primary key not null ,val char(10)) engine=innodb default charset=utf8  TABLESPACE youzan_com ;

  14. Query OK, 0 rows affected (0.03 sec)

4.5 行格式默認為DYNAMIC
     從MySQL 5.7.9 開始,行格式DYNAMIC 取代COMPACT 成為innodb存儲引擎默認的行格式,MySQL提供了新的參數(shù)innodb_default_row_format來控制Innodb 行格式

4.6 支持原生的分區(qū)表
      在MySQL 5.7.6之前的版本中,創(chuàng)建分區(qū)表時MySQL為每個分區(qū)創(chuàng)建一個ha_partition handler,自MySQL 5.7.6之后,MySQL支持原生的分區(qū)表并且只會為分區(qū)表創(chuàng)建一個partition-aware handler,這樣的分區(qū)表功能增強節(jié)約分區(qū)表使用的內(nèi)存。對于老版本創(chuàng)建的分區(qū)表在升級到新的版本之后怎么處理呢?莫慌,5.7.9之后,MySQL提供了如下升級方式解決這個問題:

  1. ALTER TABLE ... UPGRADE PARTITIONING.

當(dāng)然友情提示:從我個人的理解來看,在沒有合適的自動化維護分區(qū)表系統(tǒng)的基礎(chǔ)上,不推薦使用分區(qū)表。四年的工作經(jīng)歷已經(jīng)數(shù)次在分區(qū)表上掉坑里了。

4.7 支持truncate undo logs 
     MySQL 5.7.5版本開始支持truncate undo 表空間中的undo log。啟用該特性必須設(shè)置innodb_undo_log_truncate=[ON|1]。大致原理是系統(tǒng)必須設(shè)置至少兩個undo 表空間(初始化的時候設(shè)置 innodb_undo_tablespaces=2 ) 用于清理undo logs的切換。該特性的好處是 解決了 ibdata 文件一直增大的問題,減輕系統(tǒng)的空間使用。 

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL中innodb新特性有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI