Meine OpenLDAP-Instanz ist langsam, Datensätze zurückzugeben, wenn ein Filter eines Buchstabens und eines Platzhalters (*) für ein Feld mit einem Teilzeichenindex verwendet werden. Wenn der Filter mehr als einen Buchstaben hat, ist die Suche sehr schnell. Meine Frage ist warum?slapd langsam, um Ergebnisse zurückzugeben, wenn Filter nur aus einem Buchstaben + Platzhalter besteht
Das Szenario ist OpenLDAP v.2.4.44, LMDB Back-End, OS X, 1,3 Millionen Datensätze, Index gesetzt, wie:
olcDbIndex: objectClass eq
olcDbIndex: cn eq,sub
Wenn die Suchfilter ist ‚(cn = s *) ', dauert die Abfrage eine lange Zeit, während, wenn der Filter ' (cn = sm *) ' ist es blitzschnell ist. Running Slapindex macht keinen Unterschied.
Hier sind einige Zahlen, Zeit mit:
$time ldapsearch -H ldap:/// -D cn=Manager,dc=xyz,dc=com -w secret -b dc=xyz,dc=com -s sub -z 5 '(cn=s*)' cn sn
-- some ldap records --
real 0m0.474s
user 0m0.001s
sys 0m0.002s
Wechsel zu '(cn = sm *)' ergibt:
real 0m0.012s
user 0m0.001s
sys 0m0.003s
Um ‚(cn = smi *):
real 0m0.012s
user 0m0.001s
sys 0m0.003s
Tatsächlich bleiben diese Zeiten konstant, wenn der Filter mehr als einen Buchstaben und den Platzhalter hat.
Untersuchung weiter, fand ich, dass das Heruntergehen des Alphabets führt zu immer längeren Zeiten, aber nur für diese Suche mit einem Buchstaben.
Möchten '(cn = a *)' gibt:
real 0m0.012s
user 0m0.001s
sys 0m0.003s
'(cn = b *)':
real 0m0.046s
user 0m0.001s
sys 0m0.004s
An dieser Stelle können Sie sehen, Benutzer und System sind immer schnell, also werde ich sie von jetzt an weglassen und nur echte Zeiten anzeigen. Also:
'(cn=a*)' --> 0m0.012s
'(cn=b*)' --> 0m0.046s
'(cn=c*)' --> 0m0.105s
'(cn=d*)' --> 0m0.149s
'(cn=e*)' --> 0m0.174s
...
'(cn=m*)' --> 0m0.342s
...
'(cn=s*)' --> 0m0.523s
...
'(cn=z*)' --> 0m0.606s
Aber wenn jeder dieser Suche einen zusätzlichen Buchstaben gegeben sind, ist es wieder zu schnell (0.012s ist die avg). Aus irgendeinem Grund braucht slapd eine lange Zeit, um diesen ersten Buchstaben zu finden, aber nur wenn ein Buchstabe verwendet wird.
Bei noch genauerer Untersuchung ergibt die Filterung des Attributs 'sn' (z. B. 'sn = s *'), das NICHT indiziert ist, die gleiche Zeit wie das indexierte Attribut 'cn', wenn ein Buchstabe + Wildcard-Filter verwendet wird . Daher scheint slapd den Teilstringindex für das Attribut "cn" zu ignorieren, wenn nach einem Buchstaben + Platzhalter gefiltert wird. Durch Hinzufügen eines zweiten Buchstabens wird jedoch der Filter 'cn' schnell, während der Filter 'sn' langsam bleibt, was zu erwarten ist.
Warum passiert das und wie kann es behoben werden?