数据库系统设计(数据读写时序设计)

       数据库系统中,抛开内存型数据库的形式,多数系统在操作数据过程中都存在IO的设计,特别是对存储硬盘的IO设计,如何解决读写过程中的数据保护和读写竞争问题是比较棘手的问题,既然问题不可避免,减少问题的发生几率,降低数据竞争可以有效缓解对数据库性能带来的影响,本文就读写时序的设计中如何去处理此类问题给出一些方法。

        通常的IO设计中,都会将IO的操作单独放到一个任务中,将索引的处理和数据处理放在另外的任务中,IO操作中总体分为读操作和写操作,读操作对数据保护的影响较小,而写操作对数据保护的影响较大。

        在TREE PAGE进行追加的过程中,TREENODE的MAX和COUNTER是由索引TASK进行实时更新,表示当前的数据写入状态,数据到IO TASK进行处理后,会发消息到索引TASK中进行再更新,表示数据写入完成的状态。所以在进行判断时,主要是比较KEY的大小,KEY比当前的MAX大的情况下,可以增加到本级中的PAGE BUFFER 中,此时MAX在BUFFER没有满的情况下,MAX是增大的,此时KEY大于MAX,后续进行写文件时,会被挤到下一级。KEY小于MAX的情况,数据进入下一级 PAGE BUFFER中;当BUFFER满的情况下,MAX是减小的趋势,此时KEY大于MAX情况,推到下一级PAGE中,有一种可能,MAX当前还没有减小,KEY还小于MAX,此时KEY进入本级PAGE BUFFER 中,后续进行文件写时,会被挤到下一级。

       在数据写入到PAGE BUFFER的过程中,需要判断是否当前待写的PAGE BUFFER是可以写入,需要进行状态判断,如果是PAGE BUFFER处于写入状态,需要将数据缓存到一空间TREE ROOT BUFFER,表示数据需要加入到TREE中,等待下一个处理周期的处理,在下一个周期中,一旦 PAGE BUFFER的写入状态完成,数据就可以进行此 PAGEBUFFER的数据追加操作,写入状态完成是有IO TASK发给索引任务的。索引任务中数据追加的操作触发有两个来源,一个是原始的数据追加操作,由外部进行数据追加申请触发,一个是写操作完成消息到达来触发,由于写入数据,数据竞争而缓存到TREE ROOT BUFFER中的数据此时可以进行数据追加操作。

       在TREE PAGE读写的过程中,如果没有写入的操作,实际上是没有数据竞争的情况,不需要进行额外的处理,涉及到读IO的操作,PAGE增加读状态表示数据获取的过程,如读内存页,读磁盘页等。再有写入操作的过程中有数据竞争的情况下,可以采用重新读的基本原则,为了提高系统性能,需要最大程度降低重新读写的资源消耗,但不能避免,可以通过减少数据写入时间,将低速写和高速写分开处理,还可以通过减少数据保护的范围,小范围数据锁定,将页分成更小的页,分成不同的数据段,缩小数据锁定的时间。

       当TREE PAGE数据锁定的情况下,重新读的执行可以有两种做法,一种是增加查询的操作,可以使用定时器进行,也可以使用TASK发消息给自身,也是周期性检查的处理,但要控制好消息的频率,不形成消息震荡。还有一种比较常用的处理办法,将竞争导致的数据读取受阻,写入一个FIFO中,在写操作完成消息到达时,增加对FIFO内容的处理,也是一种比较好的重新读的设计思路。

总结:通过索引任务和IO任务的分离设计,读写时序的设计,可以有效提高数据处理能力。

猜你喜欢

转载自blog.csdn.net/DQWKLC/article/details/118658373
今日推荐