数据库缓存区相关的几个问题辨析

无论oracle、mysql、pg等关系数据库它们在读取数据时都是按照下面的步骤进行的吗?
Q1.从磁盘数据文件里读取数据,首先是把磁盘数据读到内存里(即物理读),然后在从内存里读到数据库的内存里即data buffer里(即逻辑读)对吗?
不能直接把磁盘里的数据读到data buffer 里对吗?

A:
1 原则上,冯诺依曼式的计算机,都是把数据先读到内存,CPU操作数据的对象是内存.
2 IO操作慢,所以出现了内存缓存。一般大型系统都会用缓存加速。但如果数据只被使用一次,其实缓存是没有意义的。图样的数据被读写多次,使得缓存有了存在的意义。
3 数据库更是如此,因为磁盘数据库的瓶颈在于IO。
4 内存数据库,瓶颈将在CPU和CPU的cache上,所以其cache中也会存在缓存,只是目前的技术条件下,cache中的buf不会很大。
5 具体的数据库,实现有差异,但原理相同。
6 原理是:数据库申请大块内存,称为缓存,被数据库独占,通常待数据库主进程将退出前释放。此大块内存用于存放数据等(也有一些系统的元数据,不光是用户数据);当需要查找数据的时候,先查此内存区域,存在则直接返回;不存在,到外存查找,找到后调入缓存(空间不足先淘汰其他以腾出空间),然后再返回给需要数据者。
7 PG遵循基本原理,只是其主进程初始化的过程中,即把“缓存”依据share_buff这个参数指定尺寸的内存申请后得到,一直持有,PG称之为共享缓存,用以存放系统使用的元数据和用户的数据。这种方式称为静态缓存,缺点是缓存区不能动态调整。
8 MySQL用innodb_buffer_pool_size指定缓存大小。这个变量是系统级,这确定了MySQL使用的也是静态缓存。但是MySQL5.7.5版本前进一大步,innodb_buffer_pool_size可以动态设定,于是静态缓存升级为动态缓存。
9 Oracle的缓存原理相同,属于静态缓存一类。
10 另外,数据库中存在多种缓存,除最主要数据缓存外,还有排序缓存、MySQL的Insert buff等。
11 所以,就如问题而言,有了逻辑读写和物理读写的概念。后者就是真正的IO操作。而这句则不正确“然后在从内存里读到数据库的内存里即data buffer里”,数据库的缓存数据不需要再经过“内存”倒一下手。

 

Q2.我们知道数据不可能永远在data buffer里,根据LUR算法,一些不常用的数据会被置换出data buffer,
那么这些被置换出data buffer的数据,会去哪了呢?是在操作系统内存里,还是就直接被清出内存了呢?
A:
1 此时分为2种情况。一是被修改过的数据,称为“脏数据”,务必要写回外存。
2 二是没有被修改过的数据,其所占空间直接被新数据“覆盖”。

 

Q3.不太理解,为什么索引一定会在内存里呢?它也是从索引文件里读到内存里吧,再读到index page里,对吧?
A:
1 索引是加快数据访问和定位的,访问频繁。
2 通常索引(B+树类)的头几级结构占有空间小,所以放到内存中省却了IO。
3 索引也是从外存中读入到内存的,但不一定是从“索引文件”读入,因为有的系统实现时,索引的数据和表的数据可以存放到同一个物理文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值