面試常問MySQL效能優化問題

2021-09-17 21:48:31 字數 1840 閱讀 5412

知識綜述

[1] mysql中鎖的種類:

常見的表鎖和行鎖,也有metadata lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致併發能力下降,一般是做ddl處理時使用。

行鎖則是鎖住資料行,這種加鎖方法比較複雜,但是由於只鎖住有限的資料,對於其它資料不加限制,所以併發能力強,mysql一般都是用行鎖來處理併發事務

[2] mysql四種隔離機制

未提交讀(read uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料。

提交讀(read committed):只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 (不重複讀)。

可重複讀(repeated read):可重複讀。在同乙個事務內的查詢都是事務開始時刻一致的,innodb預設級別。在sql標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀。

序列讀(serializable):完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。

[3]多版本併發控制mvcc

mysql innodb儲存引擎,實現的是基於多版本的併發控制協議——mvcc.

mvcc最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不衝突。在讀多寫少的oltp應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發效能,這也是為什麼現階段,幾乎所有的rdbms,都支援了mvcc。

在mvcc併發控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read).

快照讀:簡單的select操作,屬於快照讀,不加鎖。(當然,也有例外,下面會分析)

select * from table where ?;

當前讀:特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。  

select * from table where ? lock in share mode;

select * from table where ? for update;

insert into table values (…);

update table set ? where ?;

delete from table where ?;

1、如何理解mysql中加鎖原理

mysql加鎖機制 :

根據型別可分為共享鎖(shared lock)和排他鎖(exclusive lock)或者叫讀鎖(read lock)和寫鎖(write lock)。

根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由儲存引擎實現。

爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.

此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的程序稱為死鎖程序.

表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的innodb.

死鎖的關鍵在於:兩個(或以上)的session加鎖的順序不一致。

那麼對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序

3、mysql連線池的連線數說爆就爆了?

出現這種錯誤明顯就是 mysql_connect 之後忘記 mysql_close;

當大量的connect之後,就會出現too many connections的錯誤。

posted on

2019-04-10 10:13

sun_y 閱讀(

...)

編輯收藏

面試常問MySQL效能優化問題

知識綜述 1 mysql中鎖的種類 常見的表鎖和行鎖,也有metadata lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致併發能力下降,一般是做ddl處理時使用。行鎖則是鎖住資料行,這種加鎖方法比較複雜,但是由於只鎖住有限的資料,對於其它資料不加限制,所以併發能力強...

mysql常問內容 mysql常問問題

前言 一些自己遇到的問題及理解 需補充修改 索引型別 主鍵索引 普通索引 符合索引 唯一索引 全文索引 索引 查詢資料的資料結構,索引占用磁碟空間,更新資料的時候影響更新表的效率 資料儲存型別 聚簇索引 非聚簇索引 聚簇 採用b 樹的資料結構,聚簇索引葉子節點存放證章表的資料,所以主鍵索引就是用的聚...

python基礎面試常問程式設計問題

求數值以內的質數,合數及個數 質數 defzhishu number num 0for i in range 2 number 1 k true for j in range 2 i if i j continue if i j 0 k false break if k true print d i...