4.4. 精细约束 ID 列表大小
在大型数据库中,一些查询可能会消耗大量 CPU 和 RAM 资源。要提高性能,您可以使用 nsslapd-idlistscanlimit 属性设置默认 ID 扫描限制,该限制应用到数据库中的所有索引。但是,在某些情况下,为特定索引定义限制或不使用 ID 列表非常有用。您可以使用 nsIndexIDListScanLimit 属性为不同类型的搜索过滤器设置单独的设置。
要设置限制,例如,对于
objectClass
属性,请将 nsIndexIDListScanLimit 参数添加到 DN cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config
。
nsIndexIDListScanLimit 属性是多值,将以下参数列表用作值:
nsIndexIDListScanLimit: limit=NNN [type=eq[,sub,...]] [flags=AND[,XXX,...]] [values=val[,val,...]]
limit
: ID 列表的最大大小。有效值为:-1
:无限.0
:不要使用索引。1 到最大 32 位整数(2147483647)
: 最大 ID 数。
键入
: 可选。索引的类型。E
q、
等。该值必须是为索引定义指定的实际子
、prensIndexType
之一。例如,如果没有定义 nsIndexType=eq,则无法使用 type=eq。标志
:可选。更改应用扫描限制行为的标记。有效值为:AND
:仅应用扫描限制来搜索属性出现在 AND 子句中。或
:仅应用扫描限制以搜索属性出现在 OR 子句中。
值
:可选。要应用限制,以逗号分隔的值列表必须与搜索过滤器匹配。由于匹配一次是一次的,因此如果任何值匹配,值将会匹配。值必须一次只用于一种类型。值必须与索引类型对应,且必须与应用索引的属性的语法对应。例如,如果您指定了基于整数的属性uidNumber
,并且为eq
索引,则无法使用 type=eq values=abc。如果值包含需要转义的空格、逗号、NULL 或其他值,则应使用 LDAP 过滤器转义语法:反斜杠(\),后接该字符的 2 位数字代码。在以下示例中,DN 值中的逗号使用\2C
转义。nsIndexIDListScanLimit: limit=0 type=eq values=uid=user\2Cou=People\2Cdc=example\2Cdc=com
例 4.1. Setting nsIndexIDListScanLimit
在包含对象类
inetOrgPerson
的大型数据库中,搜索 (& (objectClass=inetOrgPerson) (uid=user) 首先会创建一个与 objectClass=inetOrgPerson 匹配的所有 1,000万 ID 的 ID 列表。当数据库应用过滤器的第二个部分时,它将搜索结果列表与 uid=user 匹配。在这种情况下,定义特定索引的限制或全部不使用 ID 列表非常有用。
要设置没有为 AND 子句中的 objectClass=inetOrgPerson 创建 ID 列表,请添加以下 nsIndexIDListScanLimit :
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config
changetype: modify
replace: nsIndexIDListScanLimit
nsIndexIDListScanLimit: limit=0 type=eq flags=AND values=inetOrgPerson
modifying entry "cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config"
在 AND 子句中使用时,没有为 objectClass=inetOrgPerson 创建 ID 列表。在所有其他情况下,应用了
nsslapd-idlistscanlimit
的值。