【性能优化】3.5 [外存查找] 索引预加载

 

【性能优化】3.4 [外存查找] 行存和带值索引

3.5 索引预加载

我们知道,大数据的索引经常也很大,需要建立多级索引,每次查找时都要一级一级地读入,才能最终定位到目标值。因为外存访问的复杂度很高,即使有操作系统的缓存能避免实质的硬盘动作,仍会有较多的内存搬动以及对象产生事务。读取和整理这些索引段的时间就成为索引查找的主要成本。

当然,如果只是一次查找,这些时间占用也很少,在现代计算机上大概在毫秒级别就能完成,一般感觉不到。但如果要反复查找几百上千次时,就会有较明显的延迟感了。

数据库处理索引查找时,一般都会自动把曾经读取过的索引段缓存起来,如果在短时间内再次用到时就不会重复读取,这样就能有效地减少查找延时。如果新的查找值总是涉及之前没有访问过的索引段,就会显得有些慢,在系统刚启动时容易产生这种现象。

SPL 也提供这种自动缓存索引段的机制,同时还提供了主动预加载部分索引段的方法,系统启动时主动加载,之后的查找都会比较快,而不必等待到这些索引段都被访问过。


A

1

=file("data.ctx").open()

2

=file("data.idx")

3

=A1.index@3(A2)

4

=A1.icursor(…;ID==123456).fetch()

@3 表示预先加载前三级索引段进内存。

SPL 组表的索引最有四级,每一级是 1K 个键值位,四级可以支持到 1T 条记录。前三级索引可能会占用到约几个 G 的空间,加载到三级索引后,对于记录数不超过 1G 的组表都不必再读索引段了,更大数据量的组表也只要再读一次索引段即可。

如果内存不足,也可以用 @2 只加载两级。

预加载的索引段缓存会全程存在,同进程的其它线程也会自动使用。

【性能优化】3.6 [外存查找] 批量查找
【性能优化】 前言及目录