資料庫索引 鎖 死鎖

2021-10-23 20:23:49 字數 2567 閱讀 5912

平衡多路查詢樹 樹的左右兩邊的層級數相差不會大於1 非葉子節值大於左邊子節點、小於右邊子節點!!!

mysql索引存在硬碟上 b+樹子節點才存資料(非葉結點僅具有索引作用),且是有序的(範圍查詢),層級也不高,減少io  b樹不管葉子節點還是非葉子節點,都會儲存資料,這樣導致在非葉子節點中能儲存的指標數量變少(有些資料也稱為扇出),指標少的情況下要儲存大量資料,只能增加樹的高度,導致io操作變多,查詢效能變低!!!!!

m階  中間節點都至少包含ceil(m/2)個孩子,最多有m個孩子  每乙個葉子節點都包含k-1個元素,其中 m/2 <= k <= m

b+樹插入是自下而上,當節點儲存大於m-1就**,向上級擴充套件。  刪除一樣!!小於(m/2)就收縮   三層的b+樹就可以存放2千萬級別的資料!!!

樹儲存在硬碟中,每個節點的讀取(或訪問),都對應一次磁碟io操作。樹的高度就等於每次查詢資料時磁碟io操作的次數。

b+樹節點存那些資料 非葉節點存關鍵字資訊,a-z排序找到根節點具體的id,在查主鍵id索引樹!!!

那些操作會鎖表

for update 表鎖,會鎖表

事務資料庫插入過程  

整體過程

死鎖 多個程序在執行過程中因爭奪資源而造成的一種僵局  a b執行緒互相獲得對方需要的鎖 你等我 我等你

互斥條件:乙個資源每次只能被乙個程序使用。

請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。!!

不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

資料庫悲觀鎖 for update 和 for update nowait  

樂觀鎖 一開始假設不會造成衝突,提交的時候再進行資料衝突檢測。

innodb實現了以下兩種型別的行鎖。

共享鎖(s):允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。  lock in share  多個事務可以同時為乙個物件加共享鎖!!!

排他鎖(x):允許獲取排他鎖的事務更新資料,阻止其他事務取得相同的資料集共享讀鎖和排他寫鎖。  for upadte  其他事務不能在加索

另外,為了允許行鎖和表鎖共存,實現多粒度鎖機制,innodb還有兩種內部使用的意向鎖(intention locks),這兩種意向鎖都是表鎖。

意向共享鎖(is):事務打算給資料行共享鎖,事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。

意向排他鎖(ix):事務打算給資料行加排他鎖,事務在給乙個資料行加排他鎖前必須先取得該錶的ix鎖。

lock tables orders read local,order_detail read local;

unlock tables;

lock in share mode

myisam和innodb都支援表級鎖。

行級鎖只有innodb支援,也是mysql中的最小粒度鎖

表級鎖lock table student read;#讀鎖 unlock tables;#解鎖 student表都只能讀取 只能執行select操作

lock table balance write;#寫鎖  乙個會話裡面都能操作  如果是寫鎖沒有解鎖,新的 會話 讀寫 都處於被鎖狀態。

行級鎖select *** lock in share mode;  只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!!!!

排它鎖select *** for upadte;  開啟了排它鎖,其他會話依然不能修改資料。但是可以普通的讀取

innodb 意向共享鎖(is)和意向排他鎖(ix) 該事務可以需要鎖定行的表上面新增乙個合適的意向鎖  意向鎖是innodb自動加的,不需使用者干預。

對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖(x);對於普通select語句,innodb不會加任何鎖;事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖。

mysql索引分為普通索引、唯一索引、主鍵索引、組合索引、全文索引   create index index_name on table(column);  unique  primary 

索引不會包含有null值的列

組合索引:在多個欄位上建立索引,遵循最左字首原則

mysql每次查詢只使用乙個索引!!!  和全表掃瞄比起來,去分析兩個索引b+樹更加耗費時間

經常插入、刪除、修改的表要減少索引

索引何時失效  explain語句

mysql能估計出全表掃瞄比使用索引更快時,不使用索引 !!!

組合索引未使用最左字首 例如組合索引(a,b),where b=b不會使用索引;

like未使用最左字首  以%開頭;

搜尋乙個索引而在另乙個索引上做order by,where a=a order by b,只使用a上的索引,因為查詢只使用乙個索引

or會使索引失效。如果查詢字段相同,也可以使用索引。例如where a=a1 or a=a2(生效),where a=a or b=b(失效)!!!!!!!  有or必全有索引!!

在索引列上的操作,函式(upper()等)、or、!=(<>)、not in等;

需要型別轉換

where中索引列有運算  where中索引列使用了函式

資料庫系列 資料庫事務 鎖 死鎖

保障資料庫事務的鎖 非鎖 死鎖 資料庫事務級別 事務級別的使用 注意事項 髒讀 不可重複讀 幻讀 不可重複讀 幻讀 事務的實現原理 寫鎖 讀寫鎖的公升級關係 也是產生死鎖的原因 共享鎖 獨佔鎖 意向共享鎖 事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。意向排他鎖 事務在給乙個資料行加排他鎖前必...

利用悲觀鎖解決資料庫死鎖

reference url it168技術文件 這邊講述的資料庫死鎖是由於查詢條件順序不對而造成的一類,主要是兩個執行緒在同時對乙個資料庫表進行操作時,出現了下列情況,假設乙個資料庫表 內有5行資料,執行緒1需要對1 4行資料進行update操作,而執行緒2需要對2 5行資料進行update操作,但...

資料庫 鎖以及死鎖的處理

鎖分類 參見 acid 原子性,一致性,隔離性,永續性 四特性,事務是恢復和併發控制的基本單位。1.樂觀鎖 樂觀鎖認為乙個使用者讀資料的時候,別人不會去寫自己所讀的資料,所以不做控制。樂觀鎖是基於系統儲存邏輯,限制較大,可能會引起髒讀等情況,得根據實際情況靈活運用 在儲存過程,函式使用 2.悲觀鎖 ...