文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信件) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

10.5.3 優化 InnoDB 唯讀交易

InnoDB 可以避免與設定已知為唯讀的交易的交易 ID (TRX_ID 欄位) 相關的額外負荷。只有可能執行寫入作業或鎖定讀取交易才需要交易 ID,例如 SELECT ... FOR UPDATE。消除不必要的交易 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 輸出中。