共计 3373 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章给大家介绍怎样解析 mysql 与 oracle 体系结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
做为一个学习 oracle 的工程师,现在开始学习 mysql。
mysql 数据库和 oracle 相比作为一个开源数据库,从学习的角度来说的话。他不像 oracle 的教育体系。文档那么全面
学习 oracle 最好的方法是看 oracle 的官方文档。本人由于英语水平有限。所以看了高性能 mysql 和深入浅出 mysql
看了俩本书都不错。所有的资料都是教你怎么干活的。对于体系架构等还是有点少。
我个人认为学习数据库,要先了解数据库的体系结构和 sql 的执行过程。经过查询很多资料。感觉自己应该是明白了
先说 oracle 体系结构,oracle 的体系结构图官方都有。网上也有好多讲这个东西的。如果不明白可以查找下看一下。oracle 的资料市面非常多。
提示:只做了 innodb 的比较,剩下的存储引擎为在之中
1,数据库(database): |—物理存储:(os 操作系统文件): |— datafile 数据文件(存储的是实实在在数据的地方)业务数据、系统数据、临时数据(order by。。)回退数据
| |—countralfile 控制文件(存储的是数据库的结构信息)
| |—logfile 日志文件(存储的是改变的数据)做恢复用
|—逻辑存储:|—表空间(table space)存数据字典的地方
|—段(磁盘 /io,存储各种类型的数据的地方)不能跨表空间
|—区(为段分配空间的)不能跨越段
|—块(最小的单位是 block)不能跨越区
2,实例(instance): |—sga:内存 cpu:shard pool 共享池:最近使用的 sql 语句(程序)和最近使用的数据字典的信息
| buffer cache 数据库缓冲区:最近使用的数据,大小由 db_cache_size 决定
| redo log buffer 日志缓冲区:最近改变的数据 log buffer。按顺序写,循环写
| java pool
| large pool
|—后台进程:|—数据库写进程 dbwr:把数据由数据库缓冲区写入数据文件里
|—日志写进程 lgwr:把数据由日志缓冲区写入日志文件里
|—检查点进程 ckpt:1,数据库同步的标志。三大核心文件必须保证在同一检查点上,数据库才能起来,最先写在日志文件里,写在数据文件的头里
| 2,触发数据库写进程,把数据由数据库缓冲区写入数据文件里
|—系统监控进程 smon:1,历程恢复
| 2,释放临时段的空间
| 3,合并相邻的空间碎片
|—程序监控进程 pmon:释放资源(包括正常和异常资源)
| MMON 监视进程每到指定时间去访问统计数据,这样就知道表空间使用量到警告或边界没有
下面看一下 mysql 的结构图
对于 mysql 来说他是线程模式。所以对应的上面 oracle 进程
master thread 主要负责将脏缓存页刷新到数据文件,执行 purge 操作,触发检查点,合并插入缓冲区
insert buffer thread 负责插入缓冲区的合并操作
read thread 负责数据库 读读操作,可配置多个读线程
write theead 负责数据库 读写操作,可配置多个写线程
log theead 用于数据库的重做日志刷新到 logfile 中
purage theead mysql5.5 之后单独的 purage theead 执行 purge 操作
事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经使用并分配的 undo 页。在 InnoDB 1.1 版本之前,purge 操作仅在 InnoDB 存储引擎的 Master Thread 中完成。而从 InnoDB 1.1 版本开始,purge 操作可以独立到单独的线程中进行,以此来减轻 Master Thread 的工作,从而提高 CPU 的使用率以及提升存储引擎的性能。用户可以在 MySQL 数据库的配置文件中添加如下命令来启用独立的 Purge Thread:
look thread 负责锁控制和死锁检测等
错误检测线程:主要负责错误监控和错误处理
write theead master thread 相当于 dbwr
数据库写进程 dbwr:把数据由数据库缓冲区写入数据文件里
master thread 主要负责将脏缓存页刷新到数据文件,执行 purge 操作,触发检查点,合并插入缓冲区
write theead 负责数据库 读写操作,可配置多个写线程
insert buffer thread 类似于 smon
系统监控进程 smon:
1,历程恢复
2,释放临时段的空间
3,合并相邻的空间碎片
insert buffer thread 负责插入缓冲区的合并操作
log theead
日志写进程 lgwr:把数据由日志缓冲区写入日志文件里
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 数据库缓冲区:最近使用的数据,大小由 db_cache_size 决定 redo log buffer 和 innodb redo log buffer
写入数据库时候先写入 redo log buffer 顺序写入内存,刷新到硬盘,顺序写。最后通过写进程刷新到 datafile 里面
保证写入的 io。
综上所述:mysql 和 mysql innodb 的别也就上述几点基本差不多。只是 mysql 简陋了好多。
学习 mysql 是可以更好的了解数据库。
关于怎样解析 mysql 与 oracle 体系结构就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。