Mysql是主流的開源關聯式資料庫,提供高效能的資料儲存服務。在做後端開發時,
有時會遇到效能瓶頸,這些瓶頸有時不是來自應用程式本身,而是來自資料庫層面。
所以所以掌握Mysql的一些底層原理有助於我們更能理解Mysql,對Mysql進行效能調優,
從而開發高效能的後端服務。
1、mysql的邏輯框架
mysql邏輯框架圖如下:
#最上層是處理客戶端過來的連接的。
主要做連線處理、授權認證、安全性等。 Mysql在這一層維護了一個執行緒池,用於處理來自客戶端的連線。 Mysql可以使用使用者名稱密碼認證,
也可以使用SSL基於X.509憑證認證。
第二層由三個部分組成:查詢快取、解析器、最佳化器。解析器用來解析SQL語句,最佳化器會對解析之後的語句進行最佳化。
在解析查詢前,伺服器會先檢查查詢緩存,如果能在其中找到對應的查詢結果,則無需再進行查詢解析、最佳化等過程,直接傳回查詢結果。預存程序、觸發器、視圖等都在這一層實現。
第三層是儲存引擎,儲存引擎負責在MySQL中儲存資料、擷取資料、開啟一個交易等等。儲存引擎透過API與上層進行通信,這些API屏蔽了不同儲存引擎之間的差異,使得這些差異對上層查詢流程透明化。儲存引擎不會去解析SQL。 mysql最常用的儲存引擎是InnoDB。
2、mysql的並發控制
如果多個執行緒同時操作數據,就有可能引發並發控制的問題。
2-1、讀寫鎖定
如果多個線程都只是讀數據,其實可以一起讀,不會互相影響,這個時候應該使用「讀鎖”,也稱為共享鎖。
取得讀鎖的執行緒之間互相不會阻塞,可以同時讀取一個資源。
如果有一個執行緒需要寫數據,則應該使用“寫鎖”,也成為排它鎖。
寫入鎖定會阻塞其它的寫鎖和讀鎖,直到寫入作業完成。
2-2、鎖定粒度
首先明確一個概念:在給定的資源上,需要加鎖的資料越少,系統能夠承載的同時數量就越高。
但加鎖也是需要消耗資源的,如果系統花費大量的時間來管理鎖,而不是存取數據,
那麼系統的效能可能會因此受影響。
所以一個好的「鎖定策略」就是要在鎖的開銷和資料的安全性之間尋求平衡,Mysql支援多個儲存引擎的架構,
每個儲存引擎都可以實現自己的鎖策略和鎖粒度。
2-3、表鎖定與行鎖
表鎖顧名思義就是鎖住整張表。表鎖定開銷比較小。對錶加寫鎖後,其它使用者對這張表的所有讀寫操作都會被阻塞。
在Mysql中,儘管儲存引擎可以提供自己的鎖,但Mysql有時候也會使用表鎖,像是ALTER TABLE之類的語句。
寫入鎖定比讀取鎖定有更高的優先權,因此一個寫鎖定請求可能會插入到讀鎖佇列的前面。
行級鎖定即鎖住整行,可以最大程度地支援並發處理,但加解鎖的開銷也會比較大。行級鎖定只在儲存引擎層實現,
所有的儲存引擎都以自己的方式實現了行級鎖定。
3、MVCC
MVCC即“多版本並發控制”,可以認為MVCC是行級鎖定的變種,但是它在很多情況下避免了加鎖定操作,
因此開銷更低。
主流的關聯式資料庫都實作了MVCC,但實作機制各有不同。實際上MVCC也沒有一個統一的標準。
但大都實現了非阻塞的讀取操作,寫入操作也只是鎖定必要的行。
MVCC保證的是每個事務裡面在執行期間看到的資料都是一致的。
但不同的交易由於開始的時間不同,所以可能對同一張表,同一時刻看到的資料是不一樣的。
在Mysql的InnoDB引擎,是透過給每行記錄後面保存兩個隱藏的列來實現的。
一個是保存行的建立時間,另一個保存了行的過期時間(或刪除時間)。
實際上儲存的並不是實際的一個時間戳,而是‘系統版本號’。
每次開啟一個事務,系統版本號碼都會遞增。事務開始時,系統版本號會作為事務的版本號,用來和查詢到的行的版本號進行比較。
下面分別介紹常見的CRUD作業中版本號碼是怎麼運作的:
INSERT
儲存目前系統版本好的作為行版本號
DELETE
將目前的系統版本號碼儲存到這行資料的「刪除版本」。
UPDATE
插入一行新紀錄,保存目前系統版本號作為航版本號,同時保存目前系統版本號到原來的行的「刪除版本」。
SELECT
只尋找版本早於目前交易版本的行。這樣可以保證事務讀取的行,要嘛之前就存在,
要嘛是這個事務本身自己插入或修改的。
行的「刪除版本」要麼未定義,要麼大於目前交易版本號。這樣可以確保事務讀取到的行,
在事務之前沒有被刪除。
MVCC只在REPEATABLE READ
和READ COMMITTED
兩個隔離等級下工作,其它兩個隔離等級不能運作。
因為READ UNCOMMITTED
總是會讀取最新的資料防,而不是符合目前交易版本的資料行。而SERIALIZABLE
則會對所有讀取的行都加鎖。
以上是為大家整理的一些關於並發控制的問題,更多相關問題請訪問PHP中文網相關教學。
推薦影片教學:https://www.php.cn/course/list/51/type/2.html
#以上是mysql的並發控制原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

ACID屬性包括原子性、一致性、隔離性和持久性,是數據庫設計的基石。 1.原子性確保事務要么完全成功,要么完全失敗。 2.一致性保證數據庫在事務前後保持一致狀態。 3.隔離性確保事務之間互不干擾。 4.持久性確保事務提交後數據永久保存。

MySQL既是數據庫管理系統(DBMS),也與編程語言緊密相關。 1)作為DBMS,MySQL用於存儲、組織和檢索數據,優化索引可提高查詢性能。 2)通過SQL與編程語言結合,嵌入在如Python中,使用ORM工具如SQLAlchemy可簡化操作。 3)性能優化包括索引、查詢、緩存、分庫分錶和事務管理。

MySQL使用SQL命令管理數據。 1.基本命令包括SELECT、INSERT、UPDATE和DELETE。 2.高級用法涉及JOIN、子查詢和聚合函數。 3.常見錯誤有語法、邏輯和性能問題。 4.優化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL是一種高效的關係型數據庫管理系統,適用於存儲和管理數據。其優勢包括高性能查詢、靈活的事務處理和豐富的數據類型。實際應用中,MySQL常用於電商平台、社交網絡和內容管理系統,但需注意性能優化、數據安全和擴展性。

SQL和MySQL的關係是標準語言與具體實現的關係。 1.SQL是用於管理和操作關係數據庫的標準語言,允許進行數據的增、刪、改、查。 2.MySQL是一個具體的數據庫管理系統,使用SQL作為其操作語言,並提供高效的數據存儲和管理。

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),