系列文章
關于時間復雜度o(1), o(n), o(logn), o(nlogn)的理解
關于HashMap的哈希碰撞、拉鏈法和key的哈希函數設計
關于JVM內存模型和堆內存模型的理解
關于代理模式的理解
關于Mysql基本概念的理解
關于軟件設計模式的理解
文章目錄
- 前言
- 一、事務隔離級別
- 二、存儲引擎
- 1.事務支持
- 2.行級鎖和表級鎖
- 三、B+樹的索引結構以及索引覆蓋、回表查詢
- 1.B+樹的索引結構
- 2.理解索引覆蓋查詢和回表查詢
- 覆蓋索引查詢
- 回表查詢
- 四、日志文件
- 五、MVCC
前言
MySQL是眾多Java開發者首選的數據庫之一,因為其是一個開源的關系型數據庫管理系統,擁有龐大的用戶社區和活躍的開發者生態系統。在處理大規模數據和高并發請求時表現優異。與Java的兼容性非常好,提供了多種Java開發所需的接口和驅動程序。它提供了事務支持、ACID特性以及數據復制和故障恢復機制,確保數據的一致性、持久性和可靠性。同時,MySQL支持水平和垂直兩種方向的擴展,可以根據應用程序的需求進行靈活的擴展和配置。
一、事務隔離級別
MySQL默認的事務隔離級別是 “可重復讀”(Repeatable Read)。這意味著在同一個事務中,多次讀取相同的數據會得到相同的結果,即使其他事務對數據進行了修改或插入操作,也不會影響當前事務中的讀取結果。MySQL的可重復讀隔離級別通過使用快照讀(Snapshot Read) 和在事務中保持一致的讀取視圖來實現。。
二、存儲引擎
最常見的包括InnoDB和MyISAM,它們在設計和功能上有一些顯著的區別:
1.事務支持
InnoDB引擎支持事務,具有ACID(原子性、一致性、隔離性、持久性)特性,可以確保數據的完整性和一致性。而MyISAM引擎不支持事務,因此在需要事務支持的應用場景下不太適用。
2.行級鎖和表級鎖
InnoDB引擎支持行級鎖,可以在并發訪問時提高性能并減少鎖沖突。而MyISAM引擎只支持表級鎖,因此在高并發環境下可能會出現較多的鎖競爭,影響性能。
三、B+樹的索引結構以及索引覆蓋、回表查詢
1.B+樹的索引結構
B+ 樹是一種多路平衡查找樹,它的特點是非葉子節點存儲索引值,葉子節點存儲實際數據。
在 B+ 樹中,葉子節點之間通過指針進行連接,形成一個有序的鏈表,便于范圍查詢。
B+ 樹的非葉子節點通常稱為索引節點,葉子節點存儲數據,最底層的葉子節點稱為數據頁,存儲實際的數據記錄。
2.理解索引覆蓋查詢和回表查詢
覆蓋索引查詢
覆蓋索引查詢是指查詢操作所涉及的字段都包含在了索引中,查詢結果可以直接從索引中獲取的查詢操作。
在 B+ 樹結構中,覆蓋索引查詢可以直接在索引的葉子節點上完成。因為葉子節點存儲了索引字段的值以及數據行的指針或主鍵值,如果查詢所需的字段都在索引中,那么可以直接從葉子節點獲取這些值,并返回給用戶,無需額外的數據檢索操作。
回表查詢
回表查詢是指在使用索引進行查詢時,需要根據索引中的指針或主鍵值,再次到數據頁(葉子節點)中檢索實際的數據記錄,才能獲取查詢結果的查詢操作。
在 B+ 樹結構中,回表查詢涉及到從索引的葉子節點(包括底層葉子節點)回溯到對應的數據頁,然后再獲取實際的數據記錄。
回表查詢會在葉子節點和底層葉子節點之間發生,因為索引葉子節點中只存儲了索引字段的值和指向數據行的指針或主鍵值,而實際的數據記錄存儲在底層葉子節點中。因此,回表查詢的結果返回層級通常是底層葉子節點。
綜上所述,覆蓋索引查詢的結果返回層級通常是索引的葉子節點,而回表查詢的結果返回層級通常是底層葉子節點,因為回表查詢需要到底層葉子節點中獲取實際的數據記錄。
四、日志文件
在 MySQL 中,底層的日志文件主要包括以下幾種:
錯誤日志 (Error Log): 錯誤日志是 MySQL 服務器記錄所有錯誤、警告以及其他相關信息的文件。它包含了服務器啟動和運行過程中的診斷信息,以及一些重要事件的記錄。錯誤日志對于故障排除和性能優化非常重要。
查詢日志 (Query Log): 查詢日志記錄了所有到 MySQL 服務器的查詢請求,包括對數據庫的讀取和寫入操作。啟用查詢日志可以幫助跟蹤應用程序對數據庫的訪問情況,便于性能優化和安全審計。
慢查詢日志 (Slow Query Log): 慢查詢日志記錄了執行時間超過閾值的查詢語句。通過分析慢查詢日志,可以發現性能瓶頸,并對查詢進行優化,提高數據庫的響應速度。
二進制日志 (Binary Log): 二進制日志包含了對數據庫執行的所有更改操作,以二進制格式記錄。它用于數據復制(replication)、故障恢復以及點播(point-in-time recovery)等場景。通過二進制日志,可以在主服務器上記錄所有更改并將其傳輸到一個或多個從服務器,從而實現數據復制。
重做日志 (Redo Log): 重做日志記錄了已經提交的事務對數據庫所做的修改。它確保了事務的持久性,即使在系統崩潰或斷電時,MySQL 也能夠通過重做日志來恢復數據。
回滾日志 (Undo Log): 回滾日志記錄了事務執行過程中的撤銷操作,用于事務的回滾和 MVCC 的實現。它記錄了事務對數據的修改操作及其對應的版本信息,在事務回滾或系統崩潰時,可以利用回滾日志來恢復數據到事務開始之前的狀態。
這些日志文件在 MySQL 中起著不同的作用,對于數據庫的管理、維護和故障恢復都至關重要。
五、MVCC
MVCC(Multi-Version Concurrency Control)是MySQL等數據庫系統中用于實現并發控制的一種技術。它允許多個事務在同時對數據庫進行讀寫操作時,能夠達到較高的并發性而不產生數據不一致的問題。
MVCC的核心思想是在數據被修改時不直接覆蓋原始數據,而是創建新版本的數據,并且在事務開始時確定一個可見性規則,以確保事務只能看到適當版本的數據。這樣,在事務中對數據進行讀取時,可以根據事務開始時創建的一致性讀取視圖來獲取數據,而不會受到其他事務修改的影響。
下面是MVCC的幾個關鍵概念:
版本號: 每個數據行都會關聯一個版本號或者時間戳,用來標識該數據行的版本信息。當數據被修改時,會創建一個新的版本,并更新版本號。
數據行的狀態: 在MVCC中,數據行可以處于不同的狀態,比如已提交、未提交等。這些狀態可以用來判斷事務是否能夠看到該行的數據。
Read View(讀取視圖): 在事務開始時,MySQL會為當前事務創建一個一致的讀取視圖。這個讀取視圖包含了事務開始時數據庫中所有數據行的版本信息。在事務執行期間,該讀取視圖保持不變,以確保事務讀取到的數據是一致的。
可見性規則: 在MVCC中,對數據行的讀取要符合可見性規則。一般情況下,事務只能看到已提交狀態的數據,而看不到未提交或已經被刪除的數據。
MVCC的實現使得數據庫系統在并發訪問時能夠保持數據的一致性,并且提高了系統的并發性能。MySQL通過MVCC來實現不同的隔離級別,包括可重復讀隔離級別。通過維護一致的讀取視圖和版本控制,MySQL可以實現事務的隔離性,并且避免了讀取操作受到其他并發事務修改的影響。