成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解MySQL數據庫Innodb內存結構和其是如何使用內存的?

數據庫 MySQL
很多朋友可能會有許多關于Innodb如何使用內存的問題。我這里將簡單介紹一下innodb內存結構,然后以innodb啟動時的分配情況做一個解釋。

概述

很多朋友可能會有許多關于Innodb如何使用內存的問題。我這里將簡單介紹一下innodb內存結構,然后以innodb啟動時的分配情況做一個解釋。

詳解mysql數據庫Innodb內存結構和其是如何使用內存的?

1. INNODB內存結構

詳解mysql數據庫Innodb內存結構和其是如何使用內存的?

(1) 聚集索引與非聚集索引:

聚集索引:主鍵,有序,存儲順序與內存一致

非聚集索引:非主鍵,無序

  • 聚集索引在葉子節點存儲的是表中的數據
  • 非聚集索引在葉子節點存儲的是主鍵和索引列
  • 使用非聚集索引查詢出數據時,拿到葉子上的主鍵再去查到想要查找的數據。(拿到主鍵再查找這個過程叫做回表)

(2) 緩沖池:

緩沖池用于存放各種數據的緩存。Innodb總是將磁盤中的數據(數據庫文件)按頁(16K)讀取到緩沖池,然后按最近最少使用算法(LRU)來保存緩沖池中的數據。

如果數據庫文件需要修改,總是先修改在緩存池中的頁(發生修改后,該頁為臟頁),然后按一定頻率刷新到磁盤中。

(3) insert buffer(插入緩沖):

使用條件:1.索引是輔助索引;2.索引不是唯一的。

也就是說,主鍵索引不使用插入緩沖。主鍵索引是聚集索引,插入是順序的,執行效率比較高,就不借助緩沖了。

但是,當表中存在輔助索引(非聚集索引,非主鍵)時,不一定是順序的了,這時需要離散的訪問,插入性能會降低。

所以,對于非聚集索引的插入和更新操作,不是直接插入到索引頁中,而是插入到緩沖中,再以一定頻率執行插入緩沖和非聚集索引葉子節點的合并操作。

注:由于非主鍵索引葉子節點存的是主鍵和當前列值,所以使用非聚集索引查詢時,先查輔助索引的那顆樹找到對應的主鍵,再查主鍵索引的那顆樹,會查兩次,效率不高。

(4) redo log(重做日志):

在事務提交的時候,Innodb會先把數據從磁盤中讀到內存進行修改,然后把事務日志寫到日志緩沖(log buffer),然后再刷新到重做日志文件(redo log file)中進行持久化,然后再定期刷新到磁盤中。

用于在實例故障恢復時,繼續那些已經commit但數據尚未完全回寫到磁盤的事務。

(5) double write(兩次寫):

為防止redo log在寫的過程中損壞,我們需要留個備份。若出現故障,先從備份中恢復redo log,再進行數據恢復。

(6) undo log:

記錄數據修改前的鏡像,用于將未提交的事務回滾到事務開始前的狀態。

undo操作:當Innodb存儲引擎回滾時,它實際上做的是與之前相關的工作,對于insert操作,Innodb會完成一個delete,對于update,則會執行一個相反的update,將修改前的行放回去。

(7) 自適應哈希索引:

Innodb會監控表上索引的查找頻率,若發現建立哈希索引會提升速度,則自動創建哈希索引。不是對整張表建立索引,而是根據訪問頻率對某些頁建立。

(8) 事務提交:

事務進行過程中,每次sql語句執行,都會記錄undo log和redo log,然后更新數據形成臟頁。然后redo log按照時間或空間等條件進行落盤,undo log和臟頁按照checkpoint進行落盤,落盤后相應的redo log就可以刪除了。

此時,事務還未commit,如果發生崩潰,則首先檢查checkpoint記錄,使用相應的redo log進行數據和undo log的恢復,然后查看undo log的狀態發現事務尚未提交,然后就使用undo log進行回滾。事務執行commit操作時,會將本事務相關的所有redo log都進行落盤,只有所有redo log落盤成功,才算commit成功。

然后內存中的數據臟頁繼續按照checkpoint進行落盤。如果此時發生了崩潰,則只使用redo log恢復數據。

2. 一些重要的概念:

  • NBLOCKS=Innodb_buffer_pool有多個頁(block)=innodb_buffer_pool_size/16384(16k)
  • OS_THREADS= if ( innodb_buffer_pool_size >= 1000Mb) = 50000
  • else if (innodb_buffer_pool_size >= 8Mb) = 10000
  • else = 1000 (該值只用在*nixes系統上,對于Windows有一點小的區別計算OS_THREADS)

3. Innodb 使用的內存包括:

詳解mysql數據庫Innodb內存結構和其是如何使用內存的?

  • innodb_buffer_pool_size
  • innodb_additional_mem_pool_size
  • innodb_log_buffer_size
  • adaptive index hash ,size (innodb buffer 索引管理區)= innodb_buffer_pool_size/64
  • system dictionary hash,size(innodb內部字典區) = 6 * innodb_buffer_pool_size/512
  • memory for sync_array,size(用于Innodb內部syncronzation的開銷)=OS_THREAD * 512
  • memory for os_event,size(用于innodb內存的syncronzation的開銷)=OS_THREAD * 216
  • memory for locking system(內存的鎖管理系統),size = 5 * 4 *NBBLOCKS

4. innodb內存使用的計算公式為:

  1. Innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + 812/16384 * innodb_buffer_pool_size + OS_THREADS * 368 

對于812/16384 * Innodb_buffer_pool_size 可以簡單的用 innodb_buffer_pool_size / 20 計算,對于OS_THREADS * 368

  1. OS_THREADS * 368 = 17.5 MB if innodb_buffer_pool_size > 1000MB 
  2. OS_THREADS * 3368 = 3.5 MB if innodb_buffer_pool_size > 8MB 

舉一個例子:

如果你的innodb_buffer_pool_size有1500MB,innodb_additional_mem_pool_size =20 MB,innodb_log_buffer_size = 8M,

Innodb 將會向系統申請內存為= 1500M + 20M + 8M + 1500/20 M +17.5 = 1620.5M

根據以上的條件可以算出Innodb最根本最需要多少內存,這樣對于服務器的內存使用也可以有一個規劃了。

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2019-08-15 07:00:54

SQLite數據庫內存數據庫

2018-10-12 11:11:39

Oracle內存結構

2010-12-13 13:26:25

分頁

2011-04-14 09:38:55

內存數據庫

2022-04-05 11:24:17

CyberDB內存數據庫Python

2021-02-22 10:37:47

存儲Prometheus

2011-07-27 09:33:16

MySQL數據庫INNODB數據庫引擎

2010-09-27 13:48:41

JVM內存結構

2013-09-24 09:30:27

Oracle內存數據庫

2011-04-14 09:27:37

內存數據庫

2022-12-07 18:45:22

內存數據庫Redis

2013-09-22 13:25:54

MongoDB內存數據庫

2021-04-13 09:07:33

InnoDB內存結構

2009-02-17 10:34:00

2022-11-11 10:13:06

數據庫內存Milvus

2011-08-25 17:49:14

MySQLmysqlcheck

2011-03-17 16:51:51

SQLServer數據加速劑

2017-08-04 09:07:11

MySQL壓力疑問

2010-09-25 12:38:40

JVM內存模型

2024-09-09 09:41:03

內存溢出golang開發者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品日韩精品国产精品 | 永久精品| 免费99视频 | 激情国产在线 | 日韩人体视频 | 亚洲iv一区二区三区 | 欧美国产精品一区二区三区 | 欧美视频三区 | 国产不卡在线 | 亚洲精品免费在线观看 | 粉色午夜视频 | 欧美一区二区三区在线观看视频 | 午夜免费观看 | 一级特黄网站 | 美女视频一区二区三区 | 国产激情视频 | 伊人久久综合影院 | 黄色免费在线观看 | 九九九久久国产免费 | 国产精品久久精品 | 色资源在线观看 | 欧美精品一区二区在线观看 | 亚洲免费视频在线观看 | 免费视频一区 | 色在线看| 色香蕉在线 | 亚洲欧美久久 | 亚洲一区二区在线播放 | 欧美精品成人一区二区三区四区 | 亚洲国产高清高潮精品美女 | 黄a网站| 免费的日批视频 | 欧美日韩高清一区 | 日韩色综合 | 亚洲欧美日韩成人在线 | 中文字幕日韩欧美一区二区三区 | 天天干天天爱天天操 | 国产精品久久久久久久久久久久久 | 欧美日韩高清在线一区 | 99久久久久 | 在线视频成人 |