国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

InnoDB 中文參考手冊 --- 12 文件空間管理和磁盤 I/O

2024-07-21 02:08:53
字體:
來源:轉載
供稿:網友
innodb 中文參考手冊 --- 犬犬(心帆)翻譯 12 文件空間管理和磁盤 i/o12.1 磁盤 i/o 和 raw devices
innodb 使用模擬的異步(simulated asynchronous)的磁盤 i/o來構建 innodb:innodb 建立許多的 i/o 線程來處理 i/o 操作,就如同 read-ahead 一樣。

從 3.23.40b 開始,innodb 使用一種被稱為“雙寫 (doublewrite)” 的新穎的文件轉儲清除(flush)技術。這增加了在操作系統崩潰或停電后的崩潰修復的安全性,并因減少了 fsync 操作的必要次數而某些 unix 系統中改善了性能。

innodb 在將頁面寫入一個數據文件前先將他們寫入到一個相鄰近的表空間中的雙寫(doublewrite)方法被雙寫緩沖(doublewrite buffer)。只有在寫入與轉儲清除(flush)雙寫緩沖結束后,innodb 才將頁面寫入到數據文件的適當的位置。如果在頁面寫入期間操作系統崩潰了,innodb 將在雙寫緩沖中找出一個完好的副本(copy)來恢復。

從 3.23.41 開始,你也可以使用一個 raw 磁盤分區(一個 raw 器件) 作為一個數據文件。當你創建一個新的數據文件時你必須在 innodb_data_file_path 設置的數據文件尺寸后立即加上關鍵詞 newraw 。這個分區必須 >= 你所指定的尺寸。注意在 innodb 中 1 mb 為 1024 x 1024 bytes,而在磁盤規約中 1 mb 通過為 1000 000 bytes。
innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3gnewraw;/dev/hdd2:2gnewraw

 

當你再次啟動數據庫系統時,你 必須 將關鍵詞改為 raw。否則 innodb 將重寫你的分區!從 3.23.44 開始,作為一個安全措施,innodb 將阻止用戶修改任何以 newraw 指定的分區中的數據。在你增加了一個新的分區后,關閉數據庫服務器,修改 my.cnf 文件,將 newraw 替換為 raw,再重起。
innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3graw;/dev/hdd2:2graw
通過使用一個 raw disk ,在 windows 和某些 unixes 系統中可以實現無緩沖(non-buffered)的 i/o。
 

在 innodb 中有兩個啟發式的(heuristics) read-ahead heuristics :順序的(sequential) read-ahead 和隨機的(random) read-ahead。在 sequential read-ahead 中 innodb 以順序的方式訪問分區中表空間一個片段。因而 innodb 將預先以一個批量讀取數據庫頁面到 i/o 系統中。中 random read-ahead 中,innodb 將表空間中似乎在進程的有用的某些空間完全讀到緩沖池(buffer pool)內。因而 innodb 投遞剩余地讀到 i/o 系統中。
12.2 文件空間管理
在配置文件中定義的數據文件形成 innodb 的表空間。文件被簡單地耦合起來形成表空間,在使用中不得被剝離。通常你不能得知你的表所占用的空間被指定在哪里, 除非使用下面的事實:在一個新建的表空間中 innodb 從文件的末端開始分配空間。

表空間由默認為 16 kb 的數據庫頁面組成。每 64 個連續的頁面被組成一區域(extent)。表空間內的“文件(files)”在 innodb 中被稱為段(segments)。回滾段(rollback segment)稍微會引起被誤解,因為實際上它在表空間內是由許多個段組成。

innodb 中的每個索引都被分配兩個段(segments):一個是為了 b-tree 的無葉結點(non-leaf nodes),另一個是為了葉結點(leaf nodes)。這是為了達到包含數據的葉結點的更好的順序(sequentiality for the leaf nodes)。

當表空間中的一個段增長時,innodb 為它個別地分配最初的 32 個頁面。之后 innodb 再分配段的整個區域(extents)。innodb 會以每次 4 個區域(extents)來增加一個大段以確保數據的良好順序。

表空間中的某些頁面包含其它頁面的位圖(bitmaps),所以在 innodb 表空間內的一些區域(extents)不能以一個整體分配給段,而只能作為個體頁面。

當發出一個查詢 show table status from ... like ... 來詢問表空間的剩余空間時,innodb 將報告表空間中所有空閑區域(extents)中確實可用的部分。innodb 通常會保留一些區域用于 clean-up 和其它的內部目的;這些保留的區域并不包含在剩余可用空間中。

當從一個表中刪除數據時,innodb 將收縮 b-tree 中相應的索引。這是依賴于釋放個別的頁面或區域(extents)以讓其他用戶使用剩余空間的刪除模式。 移除(drop)一個表或刪除所有記錄可以保證釋放空間給其他用戶,但是刪除記錄行只有在事務回滾或 consistent read 后并不需要時才會被物理的移除。
12.3 碎片整理一個表
如果在一個表的索引內有隨機地插入與刪除,索引將會產生碎片。 碎片的意思是索引頁面在磁盤上的物理順序并不接近于頁面依字母順序排序的記錄, 或分配給索引的 64 個頁面塊中有太多的未使用頁面。如果周期性的通過 mysqldump 將表轉儲到一個文件文件上,移除(drop)表,再從轉儲文件中重載它,這將提升索引掃描的速度。 另一個碎片整理的辦法就是將表類型改變為 myisam 然后再改為 innodb 。注意 myisam 表在你的操作系統上必須為一個單獨的文件。

如果索引中的插入總是上升的而總是從后面刪除,那么 innodb 的文件空間管理算法可以保證索引中的碎片不會出現。
 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗田县| 慈溪市| 全州县| 平阳县| 抚顺市| 镇赉县| 崇州市| 和田市| 称多县| 广饶县| 夏邑县| 新密市| 杨浦区| 汤原县| 大庆市| 新泰市| 徐水县| 疏附县| 枣阳市| 青铜峡市| 元朗区| 孟津县| 博爱县| 泸水县| 东光县| 如皋市| 鹤壁市| 西乌| 如东县| 新竹市| 河池市| 桐柏县| 渝北区| 池州市| 二连浩特市| 云阳县| 丹江口市| 库尔勒市| 绍兴市| 库尔勒市| 巴青县|