文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  優化 InnoDB 唯讀交易

10.5.3 優化 InnoDB 唯讀交易

InnoDB 可以避免設定交易 IDTRX_ID 欄位)所帶來的額外負荷,這些交易已知是唯讀的。只有可能執行寫入操作或鎖定讀取(例如 SELECT ... FOR UPDATE)的交易才需要交易 ID。消除不必要的交易 ID 可以減少內部資料結構的大小,每次查詢或資料變更陳述式建構讀取檢視時都會查閱這些資料結構。

InnoDB 在以下情況下偵測唯讀交易:

  • 交易以 START TRANSACTION READ ONLY 陳述式啟動。在這種情況下,嘗試對資料庫進行變更(針對 InnoDBMyISAM 或其他類型的資料表)會導致錯誤,並且交易會繼續處於唯讀狀態

    ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.

    您仍然可以在唯讀交易中變更特定於會話的暫存資料表,或對其發出鎖定查詢,因為這些變更和鎖定對任何其他交易都是不可見的。

  • autocommit 設定已開啟,因此可以保證交易是單一陳述式,並且構成交易的單一陳述式是非鎖定SELECT 陳述式。也就是說,不使用 FOR UPDATELOCK IN SHARED MODE 子句的 SELECT

  • 交易在啟動時沒有 READ ONLY 選項,但是尚未執行任何更新或明確鎖定列的陳述式。在需要更新或明確鎖定之前,交易會保持在唯讀模式。

因此,對於報表產生器等讀取密集型應用程式,您可以透過將它們分組在 START TRANSACTION READ ONLYCOMMIT 中,或在執行 SELECT 陳述式之前開啟 autocommit 設定,或者簡單地避免在查詢中穿插任何資料變更陳述式,來調整一系列 InnoDB 查詢。

關於 START TRANSACTIONautocommit 的資訊,請參閱第 15.3.1 節,「START TRANSACTION、COMMIT 和 ROLLBACK 陳述式」

注意

符合自動提交、非鎖定和唯讀 (AC-NL-RO) 條件的交易,會被排除在某些內部 InnoDB 資料結構之外,因此不會列在 SHOW ENGINE INNODB STATUS 的輸出中。