mysql基本常識

2021-07-16 04:23:24 字數 2465 閱讀 1512

首層連線處理、授權認證和安全等。

第二層架構包含mysql核心服務。包括查詢解析、分析、優化、快取以及所有的內建函式(例如:日期、時間、數學和加密函式),所有的跨儲存引擎的功能都在這一層完成,比如儲存過程、觸發器、檢視等。

第三層包含了儲存引擎。儲存引擎負責mysql的儲存與提取。伺服器通過api與儲存引擎通訊。這些介面遮蔽了不同儲存引擎的差異。

解決併發,需要兩個型別的鎖系統:共享鎖和排他鎖,也叫:讀鎖和寫鎖。讀鎖是共享的,是互相不阻塞的。多個使用者在同一時刻可以同時讀取同乙個資源,而互不干擾。寫鎖是排他的,乙個寫鎖會阻塞其他的寫鎖和讀鎖。

鎖策略是在鎖的開銷和資料的安全性之間尋求平衡。鎖粒度包括表鎖和行級鎖。

事務時一組原子性的sql查詢。acid表示原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability)。

read uncommitted(未提交讀),在該級別,事務中的修改,即使沒有提交,其他事務也都是可見的。事務可以讀取未提交的資料,被稱為髒讀。實際應用中很少。

read committed(提交讀),大多數資料庫系統的預設隔離級別是該級別,但mysql不是。乙個事務從開始直到提交之前,所做的任何修改對其他事務時不可見的。這個級別也叫不可重複讀。

repeatable read (可重複讀),該級別保證了在同一事務中多次讀取同樣記錄的結果是一致的,解決了髒讀問題。幻讀指當某個事務在讀取某個範圍的記錄是,另外乙個事務又在該範圍插入新的記錄,當之前的事務再次讀取該範圍記錄時,會產生幻行。innodb和xtradb儲存引擎通過多版本併發控制(mvcc)解決幻讀問題。可重複讀是mysql的預設事務隔離級別。

serializable(可序列化),是最高的隔離級別。在讀取的每一行資料上都加鎖,可能導致大量的超時和鎖徵用問題。實際應用中很少用到這個隔離級別。

死鎖是指兩個或多個事務在同一資源上相互占用,並請求對方占用的資源,從而導致惡性迴圈的現象。

為了解決死鎖,資料庫系統的實現了各種死鎖檢測和死鎖超時機制。innodb儲存引擎能夠檢測到死鎖的迴圈依賴,並立即返回乙個錯誤。這種方法很有效,否則會產生非常慢的查詢。另一種解決方式,當鎖的等待時間超過設定的超時時間後放棄鎖請求,這種方式不太好。

innodb儲存引擎在檢測到死鎖之後,將持有最少行級排他鎖的事務進行回滾。

事務日誌可以提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時只需要修改其記憶體拷貝,再把該修改行為記錄持久在硬碟的事務日誌中,而不是每次都將修改的事務本身持久到磁碟。事務日誌採用的是追加的方式,因此寫日誌的操作是磁碟上一小塊區域的順序i/o,而不像隨機i/o需要在磁碟多個地方移動磁頭,所以採用事務日誌的方式相對來說要快的多。事務日誌持久以後,記憶體中被修改的資料在後台中可以慢慢的刷回到磁碟。目前大多數儲存引擎是這樣實現的,通常稱之為預寫式日誌(write-ahead longging),修改資料需要寫兩次磁碟。

mysql的大多數事務型儲存引擎的實現都不是單純的行級鎖。基於提公升併發效能的考慮,都實現了多版本併發控制(mvcc),可以認為mvcc是行級鎖的乙個變種,它多數情況下避免加鎖操作,因此開銷更低。

mvcc的實現,是通過儲存資料在某個時間點的快照來實現的。也就是說,不管執行多長時間,每個事務看到的資料是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻看到的資料可能是不一樣的。

innodb的mvcc是通過每行記錄後面儲存兩個隱藏的列來實現的。這兩個列乙個儲存了行的建立時間,乙個儲存了行的過期時間(或刪除時間)。當然儲存的不是實際的時間值,而是系統版本號。每開始乙個新的事務,系統版本號都會自動遞增。事務開始時的系統版本號將作為該執行緒的版本號。用來和查詢到的每行記錄的版本號進行比較。

在repeatable read隔離級別下,mvcc的具體操作:

select:

innodb會根據會根據以下兩個條件檢查每行記錄:

1、innodb只查詢版本號早於當前事務版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務的讀取行,要麼在事務開始前已經存在,要麼是事務自身插入或修改過的。

2、行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取的行在事務開始之前未被刪除。

只有符合這兩個條件的記錄,才可以被作為查詢結果返回。

insert:

innodb為新插入的每一行儲存當前系統版本號作為行版本號。

delete:

innodb為刪除的每一行儲存當前系統版本號作為行刪除標識。

update:

innidb為插入一行新紀錄,儲存當前系統版本號作為行版本號;同時儲存當前系統版本號作為原來的行刪除標識。

儲存這兩個額外系統版本號,可以使大多數操作都可以不用加鎖。這樣設計可以使資料操作很簡單,效能很好,並且也能保證只會讀取到符合標準的行。不足之處是每行記錄都要額外的儲存空間,需要更多的行檢查操作,以及額外的維護工作。

mvcc只在repeatable read 和read commited兩個隔離級別下工作。因為read uncommited 只讀取最新的資料行,而不是符合當前事務版本的資料行。serializable則會對所有讀取的行都加鎖。

MySQL之基本常識

本文章 於 請star 強力支援,你的支援,就是我的動力。toc 優點 缺點 第一正規化 1nf 資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型 實數 字元型 邏輯型 日期型等。第二正規化 2nf 資料庫表中不存在非關鍵字段對任一候選關鍵字段的部分函式依賴 部分函式依...

ORACLE基本常識

個表空間只能屬於乙個資料庫 每個資料庫最少有乙個控制檔案 建議3個,分別放在不同的磁碟上 每個資料庫最少有乙個表空間 system表空間 建立system表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率 每個資料庫最少有兩個聯機日誌檔案 乙個資料檔案只能屬於乙個表空間 乙個資料檔案一旦被加...

電腦基本常識

一.32位cpu中的32代表什麼?1.32代表cpu的位址線長度,32位處理器表示一次只能處理32位 4個位元組 而64位處理器一次能處理64位,即8個位元組的資料。2.如果我們將總長128位的指令分別按照如果我們將總長128位的指令分別按照16位 32位 64位為單位進行編輯的話 舊的16位處理器...