mysql資料庫管理 鎖管理以及體系結構

2021-09-28 23:40:44 字數 2802 閱讀 9783

本文對 mysql 資料庫中有關鎖、事務及併發控制的知識及其原理做了系統化的介紹和總結,希望幫助讀者能更加深刻地理解 mysql 中的鎖和事務,從而在業務系統開發過程中可以更好地優化與資料庫的互動。

1、mysql 伺服器邏輯架構

每個連線都會在 mysql 服務端產生乙個執行緒(內部通過執行緒池管理執行緒),比如乙個 select 語句進入,mysql 首先會在查詢快取中查詢是否快取了這個 select 的結果集,如果沒有則繼續執行解析、優化、執行的過程;否則會之間從快取中獲取結果集

connectors:用來與客戶端應用程式建立連線的資料庫介面。

connection pool:負責處理與使用者訪問有關的各種使用者登入、執行緒處理、記憶體和程序快取需求。

sql inte***ce:提供從使用者接受命令並把結果返回給使用者的機制。

parser:對sql語句進行語法分析和解析,構造乙個月來執行查詢的資料結構。

optimizer:優化查詢語句,以保證資料檢索動作的效率達到或者非常接近最最優。使用一種「選取-投影-聯結」策略來處理查詢,即先根據有關的限制條件進行選取(select 操作)以減少將要處理的元組個數,再進行投影以減少被選取元組力的屬性欄位的個數,最後根據連線條件生產最終的查詢結果。

caches & buffers:保證使用頻率最高的資料或結構能夠以最有效率的方式被訪問,快取的型別有:表快取、記錄快取、鍵快取、許可權快取、主機名快取等。

檢查查詢快取是否開啟,檢查是否命中快取中的資料(通過對大小寫敏感的hash查詢實現的),若不命中則進行下一階段的處理。若命中查詢快取,檢查使用者許可權,若許可權沒問題,則直接把快取資料返回給客戶端。

詞法/語法解析器:將會進行語法規則的驗證和解析查詢(對語法解析),生成語法分析樹。

優化器的作用就是找到最好的執行計畫。mysql使用cbo優化器。mysql使用很多優化策略生成最優的執行計畫,可以分為兩類:靜態優化(編譯時優化)、動態優化(執行時優化)。

mysql只是簡單的根據執行計畫給出的指令逐步執行。呼叫儲存引擎實現的介面來完成執行計畫。優化器根據介面可以獲取表的相關資訊,包括表的所有列名、索引統計資訊等。將結果返回給客戶端,或者返回這個查詢的一些資訊,如查詢影響到的行數。如果查詢可以被快取,那麼mysql會將結果存放到查詢快取中。

2、mysql 鎖

它們都是標準的行級鎖

show variables like "autocommit";

set autocommit=0; //0表示autocommit關閉

set autocommit=1; //1表示autocommit開啟

6、mysql 死鎖問題

死鎖,就是產生了迴圈等待鏈條,我等待你的資源,你卻等待我的資源,我們都相互等待,誰也不釋放自己占有的資源,導致無線等待下去。 比如:

//session a

start transaction;

update account set p_money=p_money-100 where p_name="tim";

update account set p_money=p_money+100 where p_name="bill";

commit;

//thread b

start transaction;

update account set p_money=p_money+100 where p_name="bill";

update account set p_money=p_money-100 where p_name="tim";

commit;

當執行緒a執行到第一條語句update account set p_money=p_money-100 where p_name="tim";鎖定了p_name="tim" 的行資料;並且試圖獲取 p_name="bill" 的資料;

此時,恰好,執行緒b也執行到第一條語句:update account set p_money=p_money+100 where p_name="bill";鎖定了p_name="bill" 的資料,同時試圖獲取 p_name="tim" 的資料;

此時,兩個執行緒就進入了死鎖,誰也無法獲取自己想要獲取的資源,進入無線等待中,直到超時!

innodb_lock_wait_timeout等待鎖超時回滾事務:

直觀方法是在兩個事務相互等待時,當乙個等待時間超過設定的某一閥值時,對其中乙個事務進行回滾,另乙個事務就能繼續執行。

這種方法簡單有效,在i nnodb 中,引數 innodb_lock_wait_timeout 用來設定超時時間。

wait-for graph演算法來主動進行死鎖檢測:innodb 還提供了wait-for graph 演算法來主動進行死鎖檢測,每當加鎖請求無法立即滿足需要並進入等待時,wait-for graph 演算法都會被觸發。

6.1、如何盡可能避免死鎖

資料庫PostrageSQL 鎖管理

deadlock timeout integer 這是進行死鎖檢測之前在乙個鎖上等待的總時間 以毫秒計 死鎖檢測相對昂貴,因此伺服器不會在每次等待鎖時都執行這個它。我們樂觀地假設在生產應用中死鎖是不常出現的,並且只在開始檢測死鎖之前等待一會兒。增加這個值就減少了浪費在無用的死鎖檢測上的時間,但是減慢...

docker安裝MySQL以及資料庫管理工具連線

安裝docker可以安裝客戶端,也可以在伺服器或者linux虛擬機上安裝,個人傾向於在伺服器上 下面介紹虛擬機上安裝 systemctl start docker 啟動docker systemctl enable docker 設定docker自啟動 docker search mysql doc...

mysql庫管理命令 MySQL資料庫管理常用命令

安裝利用rpm包安裝mysql,設定tcp 3306埠的iptables。root密碼管理設定root使用者的密碼mysqladmin uroot password password 修改root使用者的密碼mysqladmin uroot p password password 資料庫,表管理進入...