MySQL常用基礎概念(一)

2021-10-07 11:20:47 字數 2818 閱讀 8164

1.1mysql邏輯框架

mysql伺服器邏輯框架大概分為三層;

最上層的服務是 連線/線層處理層 用於直接接受客戶端的請求,這一層並不是mysql所獨有的,大多數給予網路的客戶端/伺服器的工具或者服務都有類似的架構;

第二層架構 包含 解析、分析、優化、快取、以及所有內建函式(例如:日期、時間、數學和加密函式),所有跨儲存引擎的功能都在這一層實現:儲存過程、觸發器、檢視等;

第三層包函了儲存引擎,儲存引擎負責mysql中資料的儲存和提取,和gun/linux下的各種檔案系統一樣,每個儲存引擎都有它的優勢和劣勢。伺服器通過api與儲存引擎進行通訊。

1.1.1連線管理與安全性

每個客戶端都會在伺服器程序中擁有乙個執行緒,這個連線的查詢只會在這個單獨的執行緒中執行,該執行緒只能輪流在某個cpu核心或者cpu中執行,伺服器會負責快取執行緒,因此不需要為每乙個新建的連線建立或者銷毀執行緒

當客戶端連線到mysql伺服器時,伺服器需要對其認證,認證基於使用者名稱、原始主機資訊和密碼,如果使用了安全套接字(ssl)的方式連線,還可以使用x.509證書認證,一旦客戶端連線成功,伺服器就會繼續驗證該客戶是否具有執行某個特定查詢的許可權;

1.1.2優化與執行

mysql會解析查詢,並建立內部資料結構(解析樹),然後對其進行各種優化,包含重寫查詢、決定標的讀取資料,以及選擇合適的索引等。

1.2 併發控制

併發控制有多個查詢需要在同一時刻修改資料所產生的問題,多個程序在對同一資料進行修改就會出現資料沒有按照預先的設定來,所以為了解決這個問題,有了鎖的概念,在乙個程序操作時,先鎖上,等待操作結束後才釋放鎖,下乙個程序才可以再次使用。

1.2.1 讀寫鎖

為了解決併發的問題,提出了鎖的概念,鎖又分為兩種型別,分別是 讀鎖(共享型) 和 寫鎖(排他型),讀鎖是共享的,或者說是互相不阻塞的。多個客戶在同一時刻可以讀取同一資源,互不干擾。寫鎖則是排他型的,也就是說乙個寫鎖會阻塞其他寫鎖和讀鎖,只有這樣,才能確保在給定的時間裡,只有乙個使用者能執行寫入,並防止其他使用者讀取正在寫入的資料

1.2.2 鎖粒度

鎖粒度 更像是一種鎖策略,既是在鎖的開銷和資料安全性之間尋找平衡,這種平衡當然也會影響到效能,主要是最小開銷來鎖定資料,分為: 表鎖 和 行級鎖

表鎖表鎖是mysql中最基本的鎖策略,並且是最小的策略,表鎖會鎖定整張表,乙個使用者在對錶進行寫操作(插入、刪除、更新等)前,需要先獲得寫鎖,這回阻塞其他使用者對該錶的所有讀寫操作,只有沒有寫鎖時,其他讀取的使用者才能獲取讀鎖,讀鎖之間 互相不阻塞的。

行級鎖行級鎖可以最大程度的支援併發處理(同時也帶來了最大的鎖開銷),眾所周知,在innodb 和 xtradb,以及其他一些儲存引擎中實現了行級鎖,行級鎖只在儲存引擎層實現,而mysql伺服器層沒有實現。

1.3 事務

事務就像是乙個任務清單,裡面有多條任務,這些任務要麼全部執行,要麼全部不執行,是為了保證不會因為某個邏輯的資料不會丟失或錯誤中斷,而造成相關的資料 部分執行 部分沒有執行而造成的資料差,事務具有acid性,acid表示 原子性、一致性、隔離性、永續性,乙個良好的事務處理系統,必須具備這些標準特徵

原子性(atomicity)

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

一致性 (consistency)

資料庫總是從乙個一致性的狀態裝換到另外乙個一致性的狀態,一致性確保了 事務執行到了一半系統奔潰,資料還是之前的狀態,因為事務最終沒有提交

隔離性(isolation)

乙個事務所做的修改在最終提交以前,對其他事務是不可見的,比如乙個事務正在執行中且修改了資料,但並未提交,另乙個查詢事務不會看到這個未提交的修改資料

永續性(durability)

一旦事務提交,則其所做的修改就會永久的儲存到資料庫中,此時即使系統崩潰,修改的資料也不會丟失。

1.3.1 隔離級別

在sql標準中定義了四種隔離級別(未提交讀 、提交讀、可重複讀、可序列化),每一種隔離級別都規定了乙個事務中所做的修改,哪些事務內和事務間是可見的,哪些是不可見的,較低階別的隔離通道可以執行更高的併發,系統的開銷也更低

read uncommitted(未提交讀)

事務中的修改,即使沒有提交,對其他事務也都是可見的,事務可以讀取未提交的資料,這也被稱為髒讀

read committed(提交讀)

大多數資料庫系統的預設隔離級別都是read committed(但mysql不是)。這個級別定義是:乙個事務開始時,只能「看見」已經提交的事務所做的修改,即該事務未提交的資料對於其他事務來說是不可見的

repeatable read(可重複讀)

repeatable read解決了髒讀的問題,該級別保證了在同乙個事務中多次讀取同樣的記錄的結果是一致的,可重複讀是mysql預設事務隔離級別。

serialzable(可序列化)

serialzable 是最高的隔離級別,它通過強制事務序列執行,避免了幻讀問題(即當某個事物在讀取某個範圍內的記錄時,另外乙個事務有插入了新的資料,當之前的事務再次讀取該範圍的記錄時,會產生幻行),serialzable 會在讀取的每一行資料上都加上鎖,所以會導致大量的超時和鎖爭用的問題,實際應用中很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮該隔離級別

1.3.2 死鎖

死鎖是指兩個或者多個事務在同一資源上相互占用,並請求鎖定對方的占用的資源,從而導致的惡性迴圈的結果,當多個事務檢視以不同的順序鎖定資源時,就會產生死鎖,多個事務同時鎖定乙個資源時,也會產生死鎖。

鎖的行為和順序是和儲存引擎相關的,以同樣的順序執行語句,有些儲存引擎會產生死鎖,有些則不會,比如innodb 儲存引擎,能夠檢測死鎖的迴圈依賴,並立即返回乙個錯誤,這種結局方式很有效,否則死鎖會導致出現非常慢的查詢

MySQL常用基礎概念(二)

mysql常用基礎概念 二 1.3.3 事務日誌 事務日誌可以幫助提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時只需要修改其記憶體拷貝,再把該修改行為記錄到持久在硬碟的事務日誌中,而不用每次都將修改的資料本身持久化到磁碟 1.3.4 mysql中的事務 mysql提供了兩種事務型的儲存引擎 ...

mysql(一) 基礎概念

mysql 為關係型資料庫 relational database management system 這種所謂的 關係型 可以理解為 的概念,乙個關係型資料庫由乙個或數個 組成,如圖所示的乙個 2.在安裝資料夾下找到 my small.ini 配置檔案,將其重新命名為 my.ini 開啟進行編輯,...

MySQL(一) 基礎概念

關係型資料庫是建立在關係模型上的,關係模型本質是若干個儲存資料的二維表,表的每一行稱為記錄 record 記錄是乙個邏輯意義上的資料。表的每一列稱為字段 column 同一表的每一行記錄都有相同的若干字段。字段定義了資料型別,以及是否被允許為null null表示字段資料不存在,乙個整型字段如果為n...