InnoDB
可以避免設定交易 ID(TRX_ID
欄位)所帶來的額外負荷,這些交易已知是唯讀的。只有可能執行寫入操作或鎖定讀取(例如 SELECT ... FOR UPDATE
)的交易才需要交易 ID。消除不必要的交易 ID 可以減少內部資料結構的大小,每次查詢或資料變更陳述式建構讀取檢視時都會查閱這些資料結構。
InnoDB
在以下情況下偵測唯讀交易:
交易以
START TRANSACTION READ ONLY
陳述式啟動。在這種情況下,嘗試對資料庫進行變更(針對InnoDB
、MyISAM
或其他類型的資料表)會導致錯誤,並且交易會繼續處於唯讀狀態ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
您仍然可以在唯讀交易中變更特定於會話的暫存資料表,或對其發出鎖定查詢,因為這些變更和鎖定對任何其他交易都是不可見的。
autocommit
設定已開啟,因此可以保證交易是單一陳述式,並且構成交易的單一陳述式是「非鎖定」SELECT
陳述式。也就是說,不使用FOR UPDATE
或LOCK IN SHARED MODE
子句的SELECT
。交易在啟動時沒有
READ ONLY
選項,但是尚未執行任何更新或明確鎖定列的陳述式。在需要更新或明確鎖定之前,交易會保持在唯讀模式。
因此,對於報表產生器等讀取密集型應用程式,您可以透過將它們分組在 START TRANSACTION READ ONLY
和 COMMIT
中,或在執行 SELECT
陳述式之前開啟 autocommit
設定,或者簡單地避免在查詢中穿插任何資料變更陳述式,來調整一系列 InnoDB
查詢。
關於 START TRANSACTION
和 autocommit
的資訊,請參閱第 15.3.1 節,「START TRANSACTION、COMMIT 和 ROLLBACK 陳述式」。
符合自動提交、非鎖定和唯讀 (AC-NL-RO) 條件的交易,會被排除在某些內部 InnoDB
資料結構之外,因此不會列在 SHOW ENGINE INNODB STATUS
的輸出中。