MySQL技術內幕 InnoDB儲存引擎:外來鍵與鎖
外來鍵主要用於引用完整性的約束檢查。在InnoDB儲存引擎中,對於一個外來鍵列,如果沒有顯示地對這個列加索引,InnoDB儲存引擎會自動對其加一個索引,因為這樣可以避免表鎖。 這比Oracle資料庫做得好,Oracle資料庫不會自動新增索引,使用者必須自己手動新增,這也導致了Oracle資料庫中可能產生死鎖。
對於外來鍵值的插入或更新,首先需要檢查父表中的記錄,既SELECT父表。但是對於父表的SELECT操作,不是使用一致性非鎖定讀的方式,因為這會發生資料不一致的問題,因此這時使用的是SELECT…LOCK IN SHARE MODE方式,即主動對父表加一個S鎖。如果這時父表上已經這樣加X鎖,子表上的操作會被阻塞,如下:
在上述的例子中,兩個會話中的事務都沒有進行COMMIT或ROLLBACK操作,而會話B的操作會被阻塞。這是因為tag_id為3的父表在會話中已經加了一個X鎖,而此時在會話B中使用者又需要對父表中tag_id為3的行加一個S鎖,這時INSERT的操作會被阻塞。
本文整理自:《MySQL技術內幕 InnoDB儲存引擎》
個人微信公眾號:
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關推薦
MySQL技術內幕 InnoDB儲存引擎:外來鍵與鎖
外來鍵主要用於引用完整性的約束檢查。在InnoDB儲存引擎中,對於一個外來鍵列,如果沒有顯示地對這個列加索引,InnoDB儲存引擎會自動對其加一個索引,因為這樣可以避免表鎖。 這比Oracle資料庫做得好,Oracle資料庫不會自動新增索引,使用者必須自己手動新增,這也導致了Oracle
MySQL技術內幕 InnoDB儲存引擎:阻塞、死鎖、鎖升級
1、堵塞 因為不同鎖之間的相容性關係,在有些時刻一個事務中的鎖需要等待另外一個事務中的鎖釋放它所佔用的資源,這就是堵塞。 引數innodb_lock_wait_timeout用來控制等待的時間,預設50秒,是可以動態設定的。 引數innodb_rollback_on
MySQL技術內幕 InnoDB儲存引擎:一致性鎖定讀
在前一小節中講到,在預設配置下,即事務的隔離級別為 REPEATABLE READ 模式下, InnoDB 儲存引擎的 SELECT 操作使用一致性非鎖定讀。但是在某些情況下,使用者需要顯式地對資料庫讀取操作進行加鎖以保證資料邏輯的一致性。而這要求資料庫支援加鎖語句,即使是對於SELEC
MySQL技術內幕 InnoDB儲存引擎:一致性非鎖定讀
一致性的非鎖定行讀(consistent nonlocking read)是指InnoDB儲存引擎通過行多版本控制(multi versioning)的方式來讀取當前執行時間資料庫中行的資料。如果讀取的行正在執行DELETE、UPDATE操作,這是讀取操作不會因此而會等待行上鎖的釋放,相
MySQL技術內幕 InnoDB儲存引擎:B+樹索引的使用
1、聯合索引 MySQL允許對錶上的多個列進行索引,聯合索引的建立方法與單個索引建立的方法一樣,不同之處僅在於有多個索引列。 CREATE TABLE t( a INT, b INT, PRIMARY KEY(a), KEY idx_a_b(a, b) )ENGINE=InnoD
MySQL技術內幕 InnoDB儲存引擎:Cardinality
並不是所有在查詢條件中出現的列都需要新增索引,對於什麼時候新增B+樹索引,一般的經驗是,在訪問表中很少一部分行是使用B+樹索引才有意義。檢視索引是否是高選擇性的,可以通過SHOW INDEX語句中的Cardinality列來觀察。Cardinality是一個估計值,在實際中,Cardin
MySQL技術內幕 InnoDB儲存引擎:B+樹索引
B+ 樹索引並不能找到一個給定鍵值的具體行。 B+ 樹索引能找到的只是被查詢資料所在的頁。 然後資料庫通過把頁讀入到記憶體, 再在記憶體中進行查詢, 最後得到要查詢的資料。 平衡二叉樹 平衡二叉樹的定義如下:首先符合二叉查詢樹的定義,其次必須滿足任何節點的兩個字數的
MySQL技術內幕 InnoDB儲存引擎:分割槽表
一、MySQL分割槽表介紹 分割槽是一種表的設計模式,正確的分割槽可以極大地提升資料庫的查詢效率,完成更高質量的SQL程式設計。但是如果錯誤地使用分割槽,那麼分割槽可能帶來毀滅性的的結果。 分割槽功能並不是在儲存引擎層完成的,因此不只有InnoDB儲存引擎支援分割槽,常見的儲存引
MySQL技術內幕 InnoDB儲存引擎:鎖問題(髒讀、不可重複讀)
1、髒讀 在理解髒讀(Dirty Read)之前,需要理解髒資料的概念。但是髒資料和之前所介紹的髒頁完全是兩種不同的概念。髒頁指的是在緩衝池中已經被修改的頁,但是還沒有重新整理到磁碟中,即資料庫例項記憶體中的頁和磁碟中的頁的資料是不一致的,當然在重新整理到磁碟之前,日誌都已經被寫人到
MySQL技術內幕 InnoDB儲存引擎:行鎖的3種演算法
一、lock與latch 在資料庫中,lock與latch都可以成為鎖,但兩者有截然不同的含義 latch 一般稱為閂鎖(輕量級的鎖) 因為其要求鎖定的時間非常短,若持續時間長,則應用效能非常差,在InnoDB儲存引擎中,latch有可以分為mutex(互斥鎖)和rwlock(讀
MySQL技術內幕 InnoDB儲存引擎:事務
一、認識事務 InnoDB儲存引擎中的事務完全符合ACID的特性。ACID是以下4個詞的縮寫: 原子性(Atomicity):一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾。 一致性(consistency):資
Mysql技術內幕InnoDB儲存引擎——表&索引演算法和鎖
表 4.1、innodb儲存引擎表型別 innodb表類似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每張表都會有一個主鍵,如果在建立表時沒有顯示的定義主鍵則innodb如按照如下方式選擇或者建立主鍵。 首先表中是否有
MySQL技術內幕InnoDB儲存引擎-03檔案
1.引數檔案 當MySQL例項啟動時,MySQL會先去讀一個配置引數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化引數,這些引數通常定義了某種記憶體結構有多大等設定。 MySQL例項也可以不需要引數檔案,這時所有的引數值取決於編譯MySQL時指定的預設值和原始碼中指定引數的
MySQL技術內幕InnoDB儲存引擎-02InnoDB儲存引擎
1、InnoDB儲存引擎概述 從MySQL5.5.8版本開始是預設的表儲存引擎,該儲存引擎是第一個完整支援ACID事務的MySQL儲存引擎,其特點是行鎖設計、支援MVCC、支援外來鍵、提供一致性非鎖定讀,同時被設計用來最有效地利用以及使用記憶體和CPU。 2、InnoDB體系架構
MySQL技術內幕InnoDB儲存引擎-01mysql體系結構和儲存引擎
1.定義資料庫和例項 資料庫 (database): 物理作業系統檔案或其他形式檔案型別的集合。 例項(instance) : MySQL資料庫由後臺執行緒以及一個共享記憶體區組成,共享記憶體可以被執行的後臺執行緒所共享,資料庫例項才是真正用於操作資料庫檔案的。 mysql被設計
《MySQL技術內幕 InnoDB儲存引擎 第2版》pdf附網盤下載連結送給還在迷茫的你
技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的
Mysql技術內幕——InnoDB儲存引擎
一.mysql體系結構和儲存引擎 1.1、資料庫和例項的區別 資料庫:物理作業系統或其他形式檔案型別的集合。在mysql下資料庫檔案可以是frm,myd,myi,ibd結尾的檔案。 資料庫例項:由資料庫後臺程序/執行緒以及一個共享記憶體區組成。資料庫例
MySQL技術內幕 InnoDB儲存引擎 之 InnoDB體系架構
後臺執行緒 1.Master Thread 2.IO Thread 3.Purge Thread 4.Page Cleaner Thread 記憶體 重做日誌在以下三
【MySQL技術內幕+InnoDB儲存引擎】學習記錄
2018/11/18記錄: 花了一整週的時間看了《MySQL技術內幕+InnoDB儲存引擎》一書,本次只是對MySQL資料庫的整體有了進一步的認識,包括以下知識: 架構 的執行緒問題:主執行緒等 innodb的關鍵特性:插入緩衝、兩次寫、自適應雜湊、非同步IO、重新整理
《MySQL技術內幕——InnoDB儲存引擎》讀書筆記(二)——InnoDB儲存引擎
一、InnoDB儲存引擎概述 從MySQL5.5版本開始是預設的表儲存引擎,該儲存引擎是第一個完整支援ACID事務的MySQL儲存引擎,其特點是行鎖設計、支援MVCC、支援外來鍵 、提供一致性非鎖定讀,同事被設計用來最有效地利用以及使用記憶體和CPU。 二、InnoD