innodb是乙個多版本的儲存引擎,它儲存著有關行修改的舊版本資訊,支援事務特性,例如併發和回滾,此資訊儲存在稱為回滾段(oracle的乙個類似的資料結構)的資料結構的表空間中,innodb使用回滾段中的資訊來執行乙個事務回滾需要的撤銷操作,它還使用這些資訊為乙個一致性讀取操作建立行的早期版本。
實際上,innodb為每個儲存在資料庫中的行都新增了三個字段,乙個6位元組的db_trx_id欄位表示最後一次插入或者更新行的事務操作的事務標識,同樣的,乙個刪除操作被看作為乙個內部地更新操作在行的特殊位置被標記為已刪除;每個行同樣包含乙個7位元組的db_roll_ptr欄位稱作為回滾指標,回滾指標指向乙個被寫入到回滾段中的撤銷日誌記錄,如果行被更新了,撤銷日誌記錄包含在更新該行之前重建該行內容所必需的資訊;乙個6位元組的db_row_id欄位包含乙個在有新行插入時單調遞增的行id,如果innodb自動生成聚簇索引,索引就會包含行id的值,否則,db_row_id列不會出現在任何索引中。
回滾段中的撤銷日誌分為插入和更新撤銷日誌,插入撤銷日誌僅僅在事務回滾時需要,事務一提交就可以丟棄,更新撤銷日誌也用於一致性讀取,但是只有在innodb沒有分配快照的情況下,才可以丟棄這些快照,在一致性讀取中可能需要更新撤銷日誌中的資訊來構建資料庫行的早期版本。
定期提交你的事務,包括那些只發生一致性讀取操作的事務,否則,innodb不能從更新撤銷日誌中丟棄資料,並且回滾段可能變得太大,填滿你的表空間。
回滾段中的撤銷日誌記錄的物理大小通常小於相應的插入或更新的行,您可以使用此資訊來計算回滾段所需的空間。
如果你在表中以相同的速率插入和刪除小批量的行,清除執行緒可能滯後開始,並且由於所有「死」行,表可能變得越來越大,使所有的東西都是磁碟繫結的並且非常慢,在這種情況下,限制新的行操作,並通過調整innodb_max_purge_lag系統變數向清除執行緒分配更多資源。有關更多資訊,請參見第14.14節「innodb啟動選項和系統變數」。
innodb多版本併發控制(mvcc)將二級索引視為與聚簇索引不同,聚簇索引中的記錄就地更新,並且他們的隱藏系統列指向可以重建記錄的早期版本的撤消日誌條目,與聚簇索引記錄不同,二級索引記錄不包含隱藏的系統列,也不就地更新。
當乙個二級索引被更新後,舊的二級索引記錄將被標記為刪除,新的記錄被插入,並且被標記為刪除的記錄最終會被清除,當二級索引記錄被標記為刪除或者二級索引頁被乙個較新的事務更新時,innodb查詢聚簇索引中的資料庫記錄,在聚簇索引中,檢查記錄的db_trx_id,如果記錄在讀取事務啟動後被修改,則從撤消日誌中檢索正確版本的記錄。
如果二級索引記錄被標記為刪除或者二級索引頁被較新的事務更新,則不使用覆蓋索引技術,innodb不是從索引結構中返回值,而是在聚簇索引中查詢記錄。
但是,如果啟用索引條件下推(icp)優化,並且僅可以使用索引中的字段來評估where條件的部分內容,mysql伺服器仍將where條件的這一部分向下推送到使用索引進行評估的儲存引擎,如果找不到匹配的記錄,則避免聚簇索引查詢,如果找到匹配的記錄,即使在刪除標記的記錄中,innodb也會在聚簇索引中查詢記錄。
MySql官方文件 mysqlimport的用法
mysqlimport客戶端提供了load data infile ql語句的乙個命令列介面。mysqlimport的大多數選項直接對應load data infile子句。參見13.2.5節,load data infile語法 這樣呼叫mysqlimport shell mysqlimport ...
TRUNCATE 使用之MySQL官方文件說明
翻譯目的 自己的另一篇博文準備引用 13.1.33 truncate table syntax truncate table tbl name truncate table完全清空一張表,該操作需要使用者具有刪除表的許可權 drop privilege 邏輯上來說,truncate table 相較...
mysql 5 7 安裝(官方文件)
shell yum search libaio search for info shell yum install libaio install library shell groupadd mysql shell useradd r g mysql s bin false mysql shell ...