Skip to content

Latest commit

 

History

History
104 lines (68 loc) · 3.45 KB

规则索引.md

File metadata and controls

104 lines (68 loc) · 3.45 KB

按规则索引

Bamboo中有一项关于索引的重要创新,就是按规则索引,这个特性是过滤函数filter效率提升的基石。

那么,“规则”是什么?在我们的定义里,规则,就是filter()和get()中的第一个参数query_args,它可能是一张表,也可能是一个函数。

规则索引的总体思路是将读阶段进行的操作放在了写阶段完成(因为大部分的项目,使用filter和get的次数是有限的,衍生出的规则也是有限的。规则有限就意味着可以穷举,这就是规则索引特性设计的出发点)。

开启规则索引

Bamboo有个关于规则索引的总开关,在settings.lua中写上:

rule_index_support = true

则打开了这个总开关。

打开总开关后,并不能立即产生索引效果,还需要为要参与索引的模型进行配置。比如,我们有一个模型Project:

module(..., package.seeall)

local Model = require 'bamboo.model'

local Project = Model:extend {
	__tag = 'Bamboo.Model.Project';
	__name = 'Project';
	__fields = {
		['name'] = { required=true },	
		['intro'] = { required=true },
		['bugs'] = {foreign="Bug", st="MANY"}
	};

	init = function (self, t)
		.......
		
		return self
	end;
}

return Project

要为这个模型打开规则索引,只需要添加一个__use_rule_index=true的模型属性,添加后如下:

module(..., package.seeall)

local Model = require 'bamboo.model'

local Project = Model:extend {
	__tag = 'Bamboo.Model.Project';
	__name = 'Project';
	__use_rule_index=true;					-- 添加这一行
	__fields = {
		['name'] = { required=true },	
		['intro'] = { required=true },
		['bugs'] = {foreign="Bug", st="MANY"}
	};

	init = function (self, t)
		......
		return self
	end;
}

return Project

添加后,就打开了此模型的规则索引。以后,对此模型使用filter(), get()等函数的时候就会自动进行结果索引。

打开规则索引还有一种颗粒度更细的控制方法,这能提升索引的效率。为每个字段的字段描述表中添加一个rule_index属性。如下:

module(..., package.seeall)

local Model = require 'bamboo.model'

local Project = Model:extend {
	__tag = 'Bamboo.Model.Project';
	__name = 'Project';
	__fields = {
		['name'] = { required=true, rule_index=true },	
		['intro'] = { required=true, rule_index=true },
		['bugs'] = {foreign="Bug", st="MANY"}
	};

	init = function (self, t)
		........
		return self
	end;
}

return Project

上例中,我们为name字段和intro字段添加了规则索引。不用再为模型添加属性__use_rule_index了。

但是,这种细颗粒度的规则索引有个局限,就是当filter()的时候,写的query_args规则所涉及的字段多于添加规则索引属性的字段的话,会出错。因此,在开发阶段,一般不用这种精细度。在项目的优化阶段来做这个事情比较好。当然,不用也是可以的。

说明

  1. 规则索引并不是任何情况下都适用。它只适合query_args规则数目相对比较确定的情况;
  2. 规则索引会占用数据库更多的空间;
  3. 规则索引在内部采用了过期策略,一段时间(由bamboo.config.expiration决定,默认为30分钟)没有用到的规则索引,会自动清除掉。下次访问遇到时,再重新建立这条规则索引。

经测试,规则索引在大部分情况下能数量级地提升运行效率(用空间换时间)。