【性能优化】1.6 [内存查找] 内表索引
1.6 内表索引
序表上的索引都是针对主键的,而主键取值要求有在全表中的唯一性。如果被查找键不是主键甚至取值不唯一而无法建立为主键呢?
我们考查前面这些算法的工作原理,二分法和哈希索引都没有要求被查找键的取值在全表中有唯一性。SPL 目前没有在序表上提供非主键索引,这是为了保持序表的简单性。索引仅在数据量较大时才有意义,且经常只会用于数据只读的场景。但序表并不总是用于大数据量的场景,还常常会有改写动作,索引也要跟随更新,这非常繁琐。非主键索引还可能不止一个,序表上有太多索引会变得过于沉重,不适应小数据和更灵活的应用场景。
SPL 专门提供了由序表衍生出来的内存数据表,称为内表,主要用于较大数据量的场景,可以建立非主键索引以实现快速查找。
A |
|
1 |
=200000.new(~:id,rand(100000):K,…) |
2 |
=A1.memory() |
3 |
=A2.index(IDX;K) |
4 |
=A2.icursor(;K=123456;IDX).fetch() |
5 |
=A1.icursor(;K>=123456 && K<=654321;IDX).fetch() |
建立索引时要起个名字。icursor 使用相应索引查找会将结果返回成游标,之后要用 fetch 取出,这是为了让内表的索引和和外存数据表的索引保持一致。这些索引的工作原理和应用特征可以参考外存查找相关的内容。