mysql學習筆記之優化篇 二 之鎖

2021-07-24 10:20:35 字數 2345 閱讀 6038

對mysql的鎖這塊真的不是特別了解,學習完這一部分,有種豁然開朗的感覺。當然還是有待進一步提高。更加深入的學習。

mysql鎖的分類

1 表鎖,開銷小,加鎖快,不會出現死鎖,鎖定粒度大

2 行鎖,開銷大,加鎖慢,會出現死鎖,鎖粒度小

3 頁面鎖,介於兩者之間,會出現死鎖

myisam 表鎖,適合讀多的程式

innodb 行鎖,適合寫多和併發高的程式

檢視表鎖的狀況

show status like 'table%';
| table_locks_immediate      | 504   |

| table_locks_waited | 0 鎖等待狀態 |

| table_open_cache_hits | 0 |

| table_open_cache_misses | 0 |

| table_open_cache_overflows | 0

表鎖又分為:表共享讀鎖,表獨佔寫鎖。

加表鎖語法:lock table *** read;lock table *** write;

解除表鎖:unlock tables;

併發插入

myisam的表讀寫都是序列的。其實也支援併發插入

通過concurent_insert 0 不允許 1 有空洞允許在表尾插入 2 允許表尾插入

myisam鎖排程

讀鎖寫鎖是互斥的,讀寫操作是序列的。myisam的鎖是寫先行。

當然也可以調整myisam的鎖的行為

innodb和myisam的最大的不同

1 innodb支援事務

2 採用了行鎖

事務和acid屬性

原子性。要麼全部執行,要麼全部不執行。

一致性。事務開始和完成時資料保持一致性。

隔離性。事務不受外部併發操作影響。

永續性。當事務完成後,資料的修改是永久性的

併發事務帶來的問題

更新丟失。多事務操作同一條記錄。可以採用鎖定。

髒讀。不可重複讀。

幻讀。

事務隔離級別

實現方式

1 加鎖

2 快照實現多版本控制

未提交讀

已提交讀

可重複讀

可序列化

檢視innodb事務狀態

show status like '%innodb%';
innodb的行鎖模式以及加鎖方式

行鎖

共享鎖s,允許乙個事務去讀一行,阻止其他事務獲取相同資料集的排它s鎖

排他鎖x,允許獲得排它鎖的事務更新資料,阻止其他事務獲取相同的共享鎖和排它鎖

表鎖 意向共享鎖is

意向排它鎖ix

innodb鎖的特別注意的

1 在不通過索引條件查詢的時候,innodb確實用的是表鎖,不是行鎖。

2 mysql的行鎖是針對索引加的鎖,而不是針對記錄,使用相同的索引鍵可能出現衝突。

3 當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引,唯一索引,普通索引,innodb都是採用行鎖來對資料加鎖

4 即使建立了索引,能偶否使用索引還是由mysql判斷,如果代價高,innodb可能採用表鎖。

間隙鎖-範圍加鎖

恢復機制對innodb鎖的影響

myslql是通過binlog記錄執行增刪改查操作的。

1 mysql恢復的是sql語句的集合

2 通過binglog先後順序恢復

innodb什麼時候使用表鎖

1 事務需要更新大部分或者全部資料,表又打的時候

2 實際多表,業務複雜,容易造成死鎖,造成大量事務回滾的情況。

在使用mysql中如何儘量減少死鎖的概率

盡量使用較低階別的隔離級別

精心設計索引,並盡量使用索引反問資料,使加鎖更加精確

合理選擇事務大小

申請合適的事務級別

如果不同的程式會併發訪問多個表,應盡量約定以相同的順序來訪問表。

批量處理資料時,先對資料排序,保證每個執行緒以固定的順序來訪問記錄

更新記錄直接使用排它鎖

更新同一條記錄可以採用read commited級別

MySQL學習筆記(二)函式篇之其他函式

說明 返回由屬於一組的列值連線組合而成的結果 常與關鍵字 group by 一起使用,能夠將分組後指定的字段值都顯示出來。例 使用group concat函式查詢不同 id下對應的所有 name資訊 原表 create tableusers idint 4 not null,namevarchar ...

mysql 優化之索引篇(一)

一 索引的優點 a.索引可以加快查詢速度 b.索引是最有效的查詢優化條件 c.使用索引可以不用全表掃瞄 二 索引的缺點 a.降低了寫入的速度 insert update 寫入時不僅要求寫入到資料行,還要更新全部索引 索引的建立原則 a.盡量為用來搜尋 分類或分組的資料列編制索引,不要為輸出顯示的列編...

golang學習筆記之併發優化(二)

通往管道的資料如果一次打包傳送的效能要高於多次傳送。請看下面裡面,這個裡面我往管道裡面傳送50000000次 func main close done for i 0 i 50000000 i close c done 結果如下 time go run mutilsend.go 1249999975...