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、pre 等。该值必须是为索引定义指定的实际 nsIndexType 之一。例如,如果没有定义 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 的值。