mysql邏輯架構
事務的acid
隔離級別
四種隔離級別
隔離級別
髒讀不可重複讀
幻讀加鎖讀
read uncommitted
yesyes
yesno
read commited
noyes
yesno
repeatable read
nono
yesno
serializable
nono
noyes
mvcc(多版本併發控制)
mvcc的實現是通過儲存資料在某個時間點的快照來實現的。也就說,不管需要執行多長時間,每個事務看到的資料都是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻看到的資料可能是不一樣的。
innodb的mvcc是通過在每行記錄後面儲存兩個隱藏列來實現的,乙個儲存了行的建立時間,乙個儲存行的過期時間(或刪除時間)。當然儲存的並不是實際時間值,而是系統版本號。每開始乙個事務,系統版本號就會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。
在repeatable read隔離級別下,mvcc具體操作:
select:
innodb會根據以下兩個條件檢查每行記錄:
a. innodb只查詢版本早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號)。這樣可以確保事務讀取的行,要麼是在事務開始之前已經存在的,要麼是事務自身插入或者修改過的。
b. 行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。
只有符合上述兩個條件的記錄,才能返回作為查詢結果。
insert:
innodb為新插入的每一行儲存當前系統版本號作為行版本號。
delete:
innodb為刪除的每一行儲存當前系統版本號作為行刪除標識。
update:
innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行作為行刪除標識。
儲存這兩個額外系統版本號,使大數讀操作都可以不用加鎖。mvcc只在repeatable read和read commited兩個隔離級別下工作。因為read uncommitted總是讀取最新的資料行,而不是符合當前事務版本的資料行。而serializable則會對所有讀取的行都加鎖。
innodb和myisam儲存引擎
innodb儲存引擎
myisam儲存引擎
高效能mysql 樹 高效能mysql精要
1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...
mysql高效能索引 mysql高效能索引( )
在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...
高效能非同步爬蟲概述
同步呼叫 即提交乙個任務後就在原地等待任務結束,等到拿到任務的結果後再繼續下一行 效率低下,呼叫乙個任務,就在原地等待任務結束拿到結果後才繼續往後執行。好處 在伺服器端使用多執行緒 或多程序 的目的是讓每個連線都擁有獨立的執行緒 或程序 這樣任何乙個連線的阻塞都不會影響其他的連線。缺點 在遇到要同時...