第6章 Directory Server でのインデックスの管理
インデックス付けは、属性または値を分類および整理することにより、情報の検索と取得を容易にします。仮想リストビューコントロールを使用することで、大規模な検索結果の連続したサブセットを要求できます。
6.1. インデックスの概要 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server のインデックスの種類と、インデックスを使用する場合のメリットとデメリットについて説明します。
6.1.1. インデックスの種類 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、インデックス付きの各属性のインデックスを、インスタンスのデータベースディレクトリー内の個別のデータベースファイルに保存します。たとえば、sn
属性のインデックスは、/var/lib/dirsrv/slapd-<instance_name>/db/database_name/sn.db
ファイルに格納されています。Directory Server が 1 つの属性に対して異なるインデックスを維持している場合、各インデックスファイルには複数のインデックスタイプを含めることができます。
Directory Server は以下のインデックスタイプをサポートしています。
-
存在インデックス (
pres
) は、特定の属性を含むエントリーのリストです。たとえば、attribute=mail
のようにクライアントが頻繁に検索を行う場合はこのタイプを使用します。 -
等価インデックス (
eq
) により、特定の属性値を含むエントリーの検索が改善されます。たとえば、cn
属性に等価インデックスを設定すると、cn=first_name last_name
の検索を高速に行うことができます。 -
近似インデックス (
approx
) は、効率的な近似検索や類似検索を可能にします。たとえば、cn~=first_name last_name
、cn~=first_name
、またはcn~=first_nam
(スペルミスに注意) を検索すると、cn=first_name X last_name
というエントリーが返されます。Directory Server の metaphone 表音アルゴリズムは US-ASCII 文字のみをサポートします。したがって、近似インデックスは、英語の値でのみ使用してください。 -
部分文字列インデックス (
sub
) は、維持するためのコストがかかるインデックスですが、エントリー内の部分文字列を効率的に検索できます。部分文字列のインデックスは、各エントリーの最小 3 文字に制限されます。たとえば、telephoneNumber=*555*
と検索すると、telephoneNumber
属性に555
を含む値を持つディレクトリー内のすべてのエントリーが返されます。 - 国際インデックスは、国際ディレクトリー内の情報の検索を迅速化します。国際インデックスの作成プロセスは、通常のインデックスを作成するプロセスと似ています。ただし、オブジェクト識別子 (OID) をインデックス化する属性に関連付けることで一致するルールを適用する点が異なります。
6.1.2. インデックスのメリットとのバランス リンクのコピーリンクがクリップボードにコピーされました!
新しいインデックスを作成する前に、インデックスを維持することのメリットとコストのバランスを考えてみます。
- 近似インデックスは、通常、数字を含む属性 (電話番号など) には効率的ではありません。
- 部分文字列のインデックスはバイナリー属性では機能しません。
- イメージなど、大きな値を含む属性の等価インデックスは回避してください。
- 検索で一般的に使用されない属性のインデックスを維持すると、検索パフォーマンスを向上させることなくオーバーヘッドが増加します。
- インデックス化されていない属性は、検索要求で依然として使用できますが、検索のタイプによっては検索パフォーマンスが大幅に低下する可能性があります。
インデックスは、非常に時間がかかります。たとえば、Directory Server が追加操作を受け取った場合、Directory Server はインデックス属性を調べて、属性値に対してインデックスが維持されているかどうかを判断します。作成された属性値がインデックス化されている場合、Directory Server は新しい属性値をインデックスに追加し、その後、実際の属性値がエントリーに作成されます。
例6.1 ユーザーがエントリーを追加する際に Directory Server が行うインデックス作成手順
Directory Server が以下のインデックスを維持していると仮定します。
-
cn
およびsn
属性の等価、近似、および部分文字列インデックス。 -
telephoneNumber
属性の等価および部分文字列のインデックス。 -
description
属性の部分文字列インデックス。
たとえば、ユーザーが次のようなエントリーを追加したとします。
ユーザーがエントリーを追加すると、Directory Server は以下のステップを実行します。
-
John
およびJohn Doe
のcn
等価インデックスエントリーを作成します。 -
John
とJohn Doe
のcn
近似インデックスエントリーを作成します。 -
John
およびJohn Doe
のcn
部分文字列インデックスエントリーを作成します。 -
Doe
のsn
等価インデックスエントリーを作成します。 -
Doe
に対するsn
近似インデックスエントリーを作成します。 -
Doe
のsn
部分文字列インデックスエントリーを作成します。 -
408 555 8834
のtelephoneNumber
等価インデックスエントリーを作成します。 -
408 555 8834
のtelephoneNumber
部分文字列インデックスエントリーを作成します。 -
Manufacturing lead
のdescription
部分文字列インデックスエントリーを作成します。
この例は、大規模なディレクトリーのデータベースを作成および保守するために必要なアクションの数が、非常に多くのリソースを消費する可能性があることを示しています。
Directory Server のパフォーマンスに影響を与える可能性があるため、メンバーシップ属性 (member
、uniquemember
など) の部分文字列インデックスを定義しないでください。メンバーを追加または削除する場合 (たとえば、多数のメンバーを持つグループに uniquemember
を追加する場合)、uniquemember
の部分文字列インデックスの計算では、追加または削除された値だけでなく、すべての uniquemember
値を評価する必要があります。