書籍 《高效能MySQL》持續更新中(一)

2021-10-13 12:11:17 字數 3158 閱讀 6000

time 20200102

author venki

mysql點註

關鍵邏輯圖

mysql邏輯架構

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-zvgrwgia-1609308479142)(

第一章連線管理與安全性

表鎖

表鎖是 mysql 中最基本的鎖策略,並且是開銷最小的策略。表鎖非常類似於前文描述的郵箱加鎖機制:它會鎖定整張表

乙個使用者在對錶進行寫操作(插入、刪除、更新等)前,需要先獲得寫鎖,這會阻塞其他使用者對該錶的所有讀寫操作

只有沒有寫鎖時,其他讀取的使用者才能獲得讀鎖,讀鎖之間是不相互阻塞的。在特定的場景中,表鎖也可能有良好的效能

寫鎖也比讀鎖有更高的優先順序,因此乙個寫鎖請求可能會被插入到讀鎖佇列的前面(寫鎖可以插人到鎖佇列中讀鎖的前面,反之讀鎖則不能插入到寫鎖的前面)

儘管儲存引擎可以管理自己的鎖, mysql 本身還是會使用各種有效的表鎖來實現不同的目的。例如,伺服器會為諸如 alter tabl 〔 之類的語句使用表鎖,而忽略儲存引擎的鎖機制

行鎖

行級鎖可以最大程度地支援併發處理(同時也帶來了最大的鎖開銷)

眾所周知,在 innodb 和 xtradb ,以及其他一些儲存引擎中實現了行級鎖

行級鎖只在儲存引擎層實現,而 mysql 伺服器層沒有實現.伺服器層完全不了解儲存引擎中的鎖實現。在本章的後續內容以及全書中,所有的儲存引擎都以自己的方式顯現了鎖機制

事務

4.2 acid
乙個事務必須被視為乙個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於乙個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性

資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態。在前面的例子中,一致性確保了,即使在執行第

三、四條語句之間時系統崩潰,支票賬戶中也不會損失 200 美元,因為事務最終沒有提交,所以事務中所做的修改也不會儲存到資料庫中

通常來說,乙個事務所做的修改在最終提交以前,對其他事務是不可見的。在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外乙個賬戶彙總程式開始執行,則其看到的支票賬戶的餘額並沒有被減去 200 美元。後面我們討論隔離級別( isolation level )的時候,會發現為什麼我們要說「通常來說」是不可見的

一旦事務提交,則其所做的修改就會永久儲存到資料庫中。此時即使系統崩潰,修改的資料也不會丟失。永續性是個有點模糊的概念,因為實際上永續性也分很多不同的級別。有些永續性策略能夠提供非常強的安全保障,而有些則未必。而且不可能有能做到 100 %的永續性保證的策略(如果資料庫本身就能做到真正的持久 j 性,那麼備份又怎麼能增加永續性呢?)

4.3 隔離級別
在此級別中,事務中的修改,即使沒有提交,對其他事務也是可見的。

只能看見已經提交的事務所做的修改。換句話說,乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。

該級別保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。

隔離級別中,最高端別。強制事務序列執行,避免了前面說的幻讀問題。serializable會在讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖爭用的問題

資料引擎

5.1 innodb
5.2 myisam
myisam對整張表加鎖,而不是針對行。讀取時會對需要讀到的所有表加共享鎖,寫入時則對錶加排他鎖。但是在表有讀取查詢的同時,也可以往表中插入新的記錄(這被稱為併發插入)

對於myisam表,mysql可以手工或者自動執行檢查和修復操作,但這裡說的修復和事務恢復以及崩潰恢復是不同的概念。執行表的修復可能導致一些資料丟失,而且修復操作是非常慢的。

對於myisam表,即使是blob和text等長欄位,也可以基於其前500個字元建立索引。myisam也支援全文索引。

建立myisam表的時候,如果指定了delay_key_write選項,在每次修改執行完成時,不會立刻將修改的索引資料寫入磁碟,而是會寫到記憶體中的緩衝區,只有在情理鍵緩衝區或者關閉表的時候才會將對應的索引塊寫入到磁碟。這種方式可以極大地提公升寫入效能,但是在資料庫或者主機崩潰時會造成索引損壞,需要執行修復操作。延遲更新的特性,可以在全域性設定,也可以為單個表設定

輔助知識

執行緒

執行緒(英語:thread)是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務

資料庫幻讀:指的就是當某個事務在讀取某個範圍內的記錄時,另外乙個事務又在該範圍內插入新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行

innodb目前處理死鎖的方法是:將持有最少行級排它鎖的事務進行回滾

第三章 伺服器效能分析

效能優化簡介

單位時間內的查詢數量

SQL效能優化 持續更新中。。。。。。

1 通過rowid訪問表 索引 你可以採用基於rowid的訪問方式情況,提高訪問表的效率,rowid包含了表中記錄的物理位置資訊.oracle採用索引 index 實現了資料和存放資料的物理位置 rowid 之間的聯絡.通常索引提供了快速訪問rowid的方法,因此那些基於索引列的查詢就可以得到效能上...

高效能mysql 樹 高效能mysql精要

1 explain 中 extra using index 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則 二級索引 需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一 2 where 語句中 條件等於主鍵的 在核心索引層完成,條件等於非索引的,在服務層完成 3 讀索引...

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...