缓冲区
2.1 数据缓冲区,数据缓冲区是用来减少I/O操作的。
数据库启动时会向系统申请一块连续的内存,然后按照页大小进行格式化,(这里的页是不是按照数据设置的页大小进行格式化?),
数据缓冲区是 在将数据写入磁盘之前放的地方,数据从磁盘读取出来也是放在这里。
- 一条select或者update的sql进来先到数据缓冲区查找数据,如果有并且数据缓冲区的数据和磁盘上的数据一致就返回,没有或者缓冲区和磁盘上的数据不一致就去磁盘读取,读到数据所在的数据页到缓冲区。
(至于为什么缓冲区的数据和磁盘不一样,是因为如果update语句操作的数据在数据缓冲区内,他会在数据缓冲区内进行数据修改,提交后也不会立即写入磁盘。)
缓冲区缓存命中率解释:一条查询sql进来,比如这条sql查询的数据一部分在缓冲区的缓存页中,另一部分没有在缓冲区,就需要从磁盘上读取数据所在的数据页到数据缓冲区,这样缓冲区的命中率就是50%,一个好的数据库的缓冲区的命中率大小应该在90%以上,如果不是就需要调整缓冲区的大小。
2.2缓冲区的大小问题:
小了:如果数据缓冲区设置的比较小会导致,缓冲区缓存命中率低,磁盘读写频繁,为啥呢,看标红的地方。
大了:导致操作系统的内存不够用。而且还会缓存一些极少使用的数据页。其实还是大一点好,如果你的内存足够大的情况下,大了比小了好。
2.3 数据缓冲区是有大小的,必将是循环使用的。
如何循环使用:
首先讲一下数据缓冲区内的三条链和各自干什么:
- 一条是自由链,放没有使用的数据缓冲区的缓冲页。
- 一条是LRU链,放已经使用的数据缓冲区的缓冲页,包括修改的数据页和未修改的数据页。(修改的数据页为脏数据页,修改的数据页为干净的数据页)
2.1 LRU链还会对已经修改过的数据页,按照使用的顺序进行排序,当自由链被使用完时,会淘汰最近没有使用的数据页,变成自由链中的数据页。以减少IO操作
2.2 但是对使用频率非常高的数据页系统会将他们会一直存放在数据缓冲区内一个特定区域(keep类),不会参于淘汰机制。也是为了减少IO操作。
- 一条是脏链, 放已经被修改过的数据页。?有疑问脏链和LRU链的区别
干净的数据缓冲页:记住了不是没有使用的缓冲页哦,系统第一次将数据从磁盘中读取数据页到数据缓冲区中,这个时候缓冲区页上的数据和磁盘中页上的数据相同,则这个缓冲页为干净的缓冲页。
脏缓冲页:如果数据缓冲区某些缓冲页上的数据和磁盘上的数据不一致则为脏缓冲页,脏缓冲页写入磁盘的时候,数据依然存在缓冲页上,索引这个脏页就变成干净的数据缓冲页了。
脏的缓冲页一定会回写到磁盘中去的,但不是commit立即就写入到磁盘中去的,和commit没有一点点关系。
2.4数据缓冲区的类别:NORMAL、KEEP、FAST、RECYCLE
NORMAL:normal类数据缓冲区主要提供给系统使用,系统使用可以理解为,以上的操作将的操作都是系统操作,如2.1下的1,就是缓冲区正常的操作
KEEP: keep类数据缓冲区主要是存放热页的,经常使用的
RECYCLE: recycle类数据缓冲区提供给临时表使用
FAST: fast类数据缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动管理。
用户在创建表空间或者修改表空间时,可以指定表空间是NORMAL类还是KEEP类,但是不能指定成RECYCLE类和FAST类。不指定默认为NORMAL类。
在dm.ini中的参数:
NORMAL类:BUFFER(100MB) 默认值大小
KEEP类: KEEP(8MB) 默认值大小
RECYCLE类: RECYCLE(64MB) 默认值大小
FAST类: FAST_POOL_PAGES(3000) 默认值大小
数据库在读取磁盘上的页时,dm7之前是每次只读取一页,从dm7开始,当读取完个页时发现没有读完数据,就一次性读取多页,主要是为了减少I/O操作。
读取页的dm.ini参数设置:
MULTI_PAGE_GET_NUM(16页) 默认大小
总结:数据缓冲区对数据库特别重要。数据缓冲区是为了减少I/O操作,提高sql速度和数据库性能的。
数据缓冲区中如何减少I/O操作?
1.将数据缓冲区调大,如何调大,将四类NORMAL、KEEP、FAST、RECYCLE数据缓冲区调大。减少数据的I/O操作(合适的大小很迷,我也没有经验)
2.系统会将热页放在KEEP类数据缓存中,不被LRU链淘汰掉。也是手动指定表空间,将表空间设置成在KEEP类数据缓冲区,适合比较小的表。
3.设置从磁盘中读取多个数据页,减少I/O操作。