共計 3373 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章給大家介紹怎樣解析 mysql 與 oracle 體系結構,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
做為一個學習 oracle 的工程師,現在開始學習 mysql。
mysql 數據庫和 oracle 相比作為一個開源數據庫,從學習的角度來說的話。他不像 oracle 的教育體系。文檔那么全面
學習 oracle 最好的方法是看 oracle 的官方文檔。本人由于英語水平有限。所以看了高性能 mysql 和深入淺出 mysql
看了倆本書都不錯。所有的資料都是教你怎么干活的。對于體系架構等還是有點少。
我個人認為學習數據庫,要先了解數據庫的體系結構和 sql 的執(zhí)行過程。經過查詢很多資料。感覺自己應該是明白了
先說 oracle 體系結構,oracle 的體系結構圖官方都有。網上也有好多講這個東西的。如果不明白可以查找下看一下。oracle 的資料市面非常多。
提示:只做了 innodb 的比較,剩下的存儲引擎為在之中
1,數據庫(database): |—物理存儲:(os 操作系統(tǒng)文件): |— datafile 數據文件(存儲的是實實在在數據的地方)業(yè)務數據、系統(tǒng)數據、臨時數據(order by。。)回退數據
| |—countralfile 控制文件(存儲的是數據庫的結構信息)
| |—logfile 日志文件(存儲的是改變的數據)做恢復用
|—邏輯存儲:|—表空間(table space)存數據字典的地方
|—段(磁盤 /io,存儲各種類型的數據的地方)不能跨表空間
|—區(qū)(為段分配空間的)不能跨越段
|—塊(最小的單位是 block)不能跨越區(qū)
2,實例(instance): |—sga:內存 cpu:shard pool 共享池:最近使用的 sql 語句(程序)和最近使用的數據字典的信息
| buffer cache 數據庫緩沖區(qū):最近使用的數據,大小由 db_cache_size 決定
| redo log buffer 日志緩沖區(qū):最近改變的數據 log buffer。按順序寫,循環(huán)寫
| java pool
| large pool
|—后臺進程:|—數據庫寫進程 dbwr:把數據由數據庫緩沖區(qū)寫入數據文件里
|—日志寫進程 lgwr:把數據由日志緩沖區(qū)寫入日志文件里
|—檢查點進程 ckpt:1,數據庫同步的標志。三大核心文件必須保證在同一檢查點上,數據庫才能起來,最先寫在日志文件里,寫在數據文件的頭里
| 2,觸發(fā)數據庫寫進程,把數據由數據庫緩沖區(qū)寫入數據文件里
|—系統(tǒng)監(jiān)控進程 smon:1,歷程恢復
| 2,釋放臨時段的空間
| 3,合并相鄰的空間碎片
|—程序監(jiān)控進程 pmon:釋放資源(包括正常和異常資源)
| MMON 監(jiān)視進程每到指定時間去訪問統(tǒng)計數據,這樣就知道表空間使用量到警告或邊界沒有
下面看一下 mysql 的結構圖
對于 mysql 來說他是線程模式。所以對應的上面 oracle 進程
master thread 主要負責將臟緩存頁刷新到數據文件,執(zhí)行 purge 操作,觸發(fā)檢查點,合并插入緩沖區(qū)
insert buffer thread 負責插入緩沖區(qū)的合并操作
read thread 負責數據庫 讀讀操作,可配置多個讀線程
write theead 負責數據庫 讀寫操作,可配置多個寫線程
log theead 用于數據庫的重做日志刷新到 logfile 中
purage theead mysql5.5 之后單獨的 purage theead 執(zhí)行 purge 操作
事務被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 來回收已經使用并分配的 undo 頁。在 InnoDB 1.1 版本之前,purge 操作僅在 InnoDB 存儲引擎的 Master Thread 中完成。而從 InnoDB 1.1 版本開始,purge 操作可以獨立到單獨的線程中進行,以此來減輕 Master Thread 的工作,從而提高 CPU 的使用率以及提升存儲引擎的性能。用戶可以在 MySQL 數據庫的配置文件中添加如下命令來啟用獨立的 Purge Thread:
look thread 負責鎖控制和死鎖檢測等
錯誤檢測線程:主要負責錯誤監(jiān)控和錯誤處理
write theead master thread 相當于 dbwr
數據庫寫進程 dbwr:把數據由數據庫緩沖區(qū)寫入數據文件里
master thread 主要負責將臟緩存頁刷新到數據文件,執(zhí)行 purge 操作,觸發(fā)檢查點,合并插入緩沖區(qū)
write theead 負責數據庫 讀寫操作,可配置多個寫線程
insert buffer thread 類似于 smon
系統(tǒng)監(jiān)控進程 smon:
1,歷程恢復
2,釋放臨時段的空間
3,合并相鄰的空間碎片
insert buffer thread 負責插入緩沖區(qū)的合并操作
log theead
日志寫進程 lgwr:把數據由日志緩沖區(qū)寫入日志文件里
log theead 用于數據庫的重做日志刷新到 logfile 中
上述基本是我總結的 mysql 和 oracle 的 instace 中進程線程的結構
現在分析 mysql 的內存結構
共享池
shard pool 共享池:最近使用的 sql 語句(程序)和最近使用的數據字典的信息
QueryCache(下面簡稱 QC) 是根據 SQL 語句來 cache 的。一個 SQL 查詢如果以 select 開頭,那么 MySQL 服務器將嘗試對其使用 QC。每個 Cache 都是以 SQL 文本作為 key 來存的。在應用 QC 之前,SQL 文本不會被作任何處理
mysql 的 QC 很簡陋啊只要數據進行更改就會清除 qc 里的數據。原來我非常不理解的東西。現在明白了。不過深入解析沒有看
buffer cache 和 innodb buffer cache
存儲數據的地方。mysql 是在 innodb 層處理這個問題。
buffer cache 數據庫緩沖區(qū):最近使用的數據,大小由 db_cache_size 決定 redo log buffer 和 innodb redo log buffer
寫入數據庫時候先寫入 redo log buffer 順序寫入內存,刷新到硬盤,順序寫。最后通過寫進程刷新到 datafile 里面
保證寫入的 io。
綜上所述:mysql 和 mysql innodb 的別也就上述幾點基本差不多。只是 mysql 簡陋了好多。
學習 mysql 是可以更好的了解數據庫。
關于怎樣解析 mysql 與 oracle 體系結構就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。