innodb page重組空間壓縮函式(btr_page_reorganize_low)註釋
我的學習記錄原創!禁止轉載
當innodb一個page碎片頁過多會觸發重組,這個重組過程在記憶體中完成,函式主要如下:
僅此記錄!
當innodb一個page碎片頁過多會觸發重組,這個重組過程在記憶體中完成,函式主要如下:
點選(此處)摺疊或開啟
-
bool
-
btr_page_reorganize_low
-
{
-
buf_block_t* block = page_cur_get_block(cursor);//獲取buf_block_t位置
-
page_t* page = buf_block_get_frame(block); //獲取資料域指標
-
data_size1 = page_get_data_size(page); // 資料實際需要的空間不包含碎片空間
-
max_ins_size1 = page_get_max_insert_size_after_reorganize(page, 1); //可用於儲存資料剩餘的空間包含碎片空間
-
//此兩個函式都是排除了碎片因素實際的空間,也是重組後實際的空間需求
-
#ifndef UNIV_HOTBACKUP
-
temp_block = buf_block_alloc(buf_pool);//從pool分配一個臨時block
-
#else /* !UNIV_HOTBACKUP */
-
ut_ad(block == back_block1);
-
temp_block = back_block2;
-
#endif /* !UNIV_HOTBACKUP */
-
temp_page = temp_block->frame; //指向實際的資料域指標這裡儲存著實際的資料 但是此時為空
-
/* Copy the old page to temporary space */
-
buf_frame_copy(temp_page, page); //將當前頁的資料page指標指向複製到temp_page用於臨時儲存
-
#ifndef UNIV_HOTBACKUP
-
if (!recovery) {
-
btr_search_drop_page_hash_index(block);
-
}
-
#endif /* !UNIV_HOTBACKUP */
-
/* Save the cursor position. */
-
pos = page_rec_get_n_recs_before(page_cur_get_rec(cursor)); //儲存當前遊標地址這是預先定位好的 這裡返回是一個位置,這個位置在重組前後不會更改
-
/* Recreate the page: note that global data on page (possible
-
segment headers, next page-field, etc.) is preserved intact */
-
page_create(block, mtr, dict_table_is_comp(index->table), is_spatial);//在函式page_create_low的作用下初始化這個塊重構各種固定資訊,這個塊已經清空而老資訊儲存在temp中
-
/* Copy the records from the temporary space to the recreated page;
-
do not copy the lock bits yet */
-
page_copy_rec_list_end_no_locks(block, temp_block, //這裡temp block就是老的資料 逐行複製到 block中完成空間重組
-
page_get_infimum_rec(temp_page),
-
index, mtr); //複製所有的塊內部的行到新建的page中 這個函式完成了重組一行一行的插入沒有碎片空間了
-
data_size2 = page_get_data_size(page);//獲得重組後資料的空間
-
max_ins_size2 = page_get_max_insert_size_after_reorganize(page, 1);
-
if (data_size1 != data_size2 || max_ins_size1 != max_ins_size2) {//這裡做判斷重組前後有效資料和剩餘空間是否相等 不相等當然資料出現問題
-
ib::error()
-
<< "Page old data size " << data_size1
-
<< " new data size " << data_size2
-
<< ", page old max ins size " << max_ins_size1
-
<< " new max ins size " << max_ins_size2;
-
ib::error() << BUG_REPORT_MSG;
-
ut_ad(0);
-
} else {
-
success = true;
-
}
-
/* Restore the cursor position. */
-
if (pos > 0) { //重新恢復定位遊標
-
cursor->rec = page_rec_get_nth(page, pos);
-
} else {
-
ut_ad(cursor->rec == page_get_infimum_rec(page));
-
}
-
return(success);
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2145254/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle壓縮表表空間Oracle
- 測試表的空間壓縮與表空間的關係
- ts函式組註解函式
- MySQL 可以壓縮或回收磁碟空間嗎MySql
- 如何給壓縮包檔案新增註釋
- 【表壓縮】使用表壓縮技術將表所佔用空間降低到最小
- 表空間中有資料也可以壓縮表空間(資料檔案)大小
- 函式呼叫與空間分配函式
- Python 的函式註釋Python函式
- MySQL InnoDB表空間加密MySql加密
- iOS拆分,合併靜態庫以壓縮打包空間iOS
- ASP.NET Page函式呼叫順序及解釋ASP.NET函式
- 儲存空間緊張?來看 TDengine TSZ 壓縮演算法如何顯著提升壓縮率演算法
- MySQL InnoDB 共享表空間和獨立表空間MySql
- MySQL InnoDB 共享表空間和獨立表空間MySql
- 壓縮資料以節省空間和提高速度
- Rman增量壓縮備份來解決備份空間不足
- Configure innodb 表空間
- MySQL InnoDB Undo表空間配置MySql
- oracle空間收縮Oracle
- 使用CLR函式壓縮(Gzip)ntext型別欄位函式型別
- InnoDB: Error: space id and page n:o stored in the page?Error
- Mysql InnoDB刪除資料後釋放磁碟空間的方法MySql
- MySQL空間函式實現位置打卡MySql函式
- 空壓機變頻改造|空氣壓縮機變頻改造原理
- 分析表空間空閒率並收縮表空間
- 透過壓縮Docker桌面WSL 2 VM回收大量磁碟空間 - NickDocker
- 通過壓縮 Docker 桌面 WSL 2 VM 回收大量磁碟空間 - NickDocker
- 壓縮資料以節省空間和提高速度(轉)
- MySQL InnoDB臨時表空間配置MySql
- innodb表空間儲存結構
- 從引數空間到函式空間理解GBDT+XGBoost函式
- innblock 工具| InnoDB page觀察利器BloC
- oracle 壓縮備份與普通備份從空間,時間,CPU效能的比較Oracle
- vscode 沒有函式註釋提示VSCode函式
- oracle---壓縮資料以節省空間和提高速度Oracle
- MySQL innodb共享表空間新增表空間資料檔案方法MySql
- VsCode 新增檔案頭部註釋和函式註釋[koroFileHeader]VSCode函式Header