MySQL事務調優

2022-09-17 18:33:20 字數 1493 閱讀 1031

資料庫事務是資料庫系統執行過程中的乙個邏輯處理單元,保證乙個資料庫操作要麼成功,要麼失敗。

資料庫事務具有以下四個基本屬性:

正是這些特性,才保證了資料庫事務的安全性。而在mysql中,鑑於myisam儲存引擎不支援事務,mysql的事務都是在innodb儲存引擎的基礎上進行的。

innodb實現了兩種型別的鎖機制:共享鎖(s)和排他鎖(x)。

共享鎖允許乙個事務讀資料,不允許修改資料,如果其他事務要再對該行加鎖,只能加共享鎖;

排他鎖是修改資料時加的鎖,可以讀取和修改資料,一旦乙個事務對該行資料加鎖,其他事務將不能再對該資料加任務鎖。

在運算元據的事務中,不同的鎖機制會產生以下幾種不同的事務隔離級別,不同的隔離級別分別可以解決併發事務產生的幾個問題,對應如下:

innodb中的rc和rr隔離事務是基於多版本併發控制(mvcc)實現高效能事務。一旦資料被加上排他鎖,其他事務將無法加入共享鎖,且處於阻塞等待狀態,如果一張表有大量的請求,這樣的效能將是無法支援的。

mvcc對普通的 select 不加鎖,如果讀取的資料正在執行delete或update操作,這時讀取操作不會等待排它鎖的釋放,而是直接利用mvcc讀取該行的資料快照(資料快照是指在該行的之前版本的資料,而資料快照的版本是基於undo實現的,undo是用來做事務回滾的,記錄了回滾的不同版本的行記錄)。mvcc避免了對資料重複加鎖的過程,大大提高了讀操作的效能。

innodb既實現了行鎖,也實現了表鎖。行鎖是通過索引實現的,如果不通過索引條件檢索資料,那麼innodb將對錶中所有的記錄進行加鎖,其實就是公升級為表鎖了。

行鎖的具體實現演算法有三種:record lock、gap lock以及next-key lock。record lock是專門對索引項加鎖;gap lock是對索引項之間的間隙加鎖;next-key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。

record lock:單個行記錄上的鎖。

gap lock:間隙鎖,鎖定乙個範圍,但不包括記錄本身。gap鎖的目的,是為了防止同一事務的兩次當前讀,出現幻讀的情況。

next-key lock:1+2,鎖定乙個範圍,並且鎖定記錄本身。對於行的查詢,都是採用該方法,主要目的是解決幻讀的問題。

只在可重複讀或以上隔離級別下的特定操作才會取得gap lock或next-key lock;

在select 、update和delete時,除了基於唯一索引的查詢之外,其他索引查詢時都會獲取gap lock或next-key lock,即鎖住其掃瞄的範圍。

1. 結合業務場景,使用低級別事務隔離

2. 避免行鎖公升級表鎖

在innodb中,行鎖是通過索引實現的,如果不通過索引條件檢索資料,行鎖將會公升級到表鎖。表鎖是會嚴重影響到整張表的操作效能的,所以應該避免它。

3. 控制事務的大小,減少鎖定的資源量和鎖定時間長度

mysql 調優 Mysql調優

表設計 1 禁止使用外來鍵 2 多表中的相同列,必須保證列定義一致 3 國內表預設使用innodb,表字符集預設使用gbk,國際預設使用utf8的表 4 表必須包含gmt create和gmt modified欄位,即表必須包含記錄建立時間和修改時間的字段 5 單錶一到兩年內資料量超過500w或資料...

mysql調優書籍 mysql調優從書寫sql開始

理論知識 mysql 的執行機制 mysql 的sql關鍵字執行順序 1 mysql 的優化方案有哪些?1 mysql 資料庫常見的優化手段分為三個層面 sql 和索引優化 資料庫結構優化 系統硬體優化等 前兩個可以通過日常的書寫sql來實現,養成好的習慣可以事半功倍。2 sql 和索引優化習慣準則...

mysql卡的調優思路 MySQL效能調優思路

1.mysql效能調優思路 如果一台伺服器出現長時間負載過高 週期性負載過大,或偶爾卡住如何來處理?是週期性的變化還是偶爾問題?是伺服器整體效能的問題,還是某單條語句的問題?具體到單條語句,這條語句是在等待上花的時間,還是查詢上花的時間?1.1.監測並觀察伺服器的狀態.觀察伺服器狀態,一般用如下2個...