BLOGS

COMMENT

warning: file_get_contents(http://www.telize.com/geoip/54.158.238.108) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/www.4d.com/docs/includes/common.inc(1762) : eval()'d code on line 4.

自動インデックス

v11以降,フィールドにはインデックスの有無だけでなく,作成するインデックスのタイプも指定できるようになりました。インデックスは,おもに検索並び替えの速度を向上させるために使用されるものですが,最善のパフォーマンスを得るためには,各タイプの特性を正確に理解していなければなりません。この記事では,さまざまなインデックスタイプ,および謎のタイプ《自動》について説明しています。

 

インデックスのタイプ

 

4Dデータベースで設定できるインデックスのタイプは下記のとおりです。ピクチャ型のフィールドには,v12以降,インデックスが設定できるようになりました。なお,v15で新設されたオブジェクト型のフィールドにもインデックスを設定することができます。

 

  • 自動
  • Bツリー
  • クラスターBツリー
  • キーワード(テキストまたはピクチャのみ) 
  • 複合

 

Bツリーインデックスは,レコードの並び順をデータベース化したようなもので,本の目次(見出し)に相当します。インデックスは並び順に整理されているので,並び変えに適しています。また,レコードのおおまかな位置(場所)が分かるので,検索も素早く完了することができます。しかし,セレクションのサイズがレコードの総数に対して極端に少ない場合には,シーケンシャル処理よりも時間がかかるかもしれません。Bツリーインデックスは,飽くまで全レコードを対象に振られた参照だからです。 

 

クラスターBツリーは,一意なレコードの値をデータベース化したようなもので,本の語句索引に相当します。特定の値が出現するレコード群は,事前に判明しているので,DISTINCT VALUESは非常に高速です。また,レコードの総数に対して値の範囲が非常に限られている場合,検索は劇的に高速です。

 

一般的には,リレーショナルデータベースの1テーブル側(主キー)はBツリー,Nテーブル側(外部キー)はBツリーインデックスが適している,と考えられています。確かに,それは理に適っているように思えます。しかし,実際にデータベースを作成し,レコードを追加してゆくと,フィールドのタイプやレコードの配分などにもよりますが,必ずしもそうではない,つまり外部キーもBツリーインデックスにしたほうが良いケースもあることが知られています。ですから,データベースの運用を開始した後も,時折,インデックスフィールドのパフォーマンスを調査してみると良いかもしれません。


複合インデックス
は,2個以上のフィールドの内容を結合した値に対し,インデックスを作成するというものです。インデックスのタイプは,Bツリー・クラスターBツリー・キーワード型の中から選ぶことができます。複合インデックスは,ストラクチャエディターで複数のフィールドをControl/Command+クリックで選択し,コンテキストメニューから《新規複合インデックス...》を選択することによって作成することができます。フィールドを結合する順序には意味があることに留意してください。FirstName+LastNameとLastName+FirstNameでは,異なったインデックスが作成されます。フィールドの順序は,インデックスプロパティダイアログで変更することができます。

 

複合インデックスは検索と並び替えに両方において威力を発揮します。

 

たとえば,複数のフィールドを《かつ》条件のクエリで検索条件に指定した場合,基本的にインデックスが使用されるはずです。

 

DESCRIBE QUERY EXECUTION(True)

 

QUERY([Table_1];[Table_1]FN="a";*)

QUERY([Table_1]; & ;[Table_1]LN="b")

 

SET TEXT TO PASTEBOARD(Get last query path(Description in text format))

 

インデックスなし(シーケンシャル)

Table_1.FN === a And Table_1.LN === b 


LN+FNそれぞれにインデックス

AND
[index : Table_1.FN ] = a (1 record found in 0 ms)
[index : Table_1.LN ] = b (1 record found in 0 ms)


FN+LN複合インデックス

[index : FN, LN ] LIKE a , b


LN+FN複合インデックス

[index : LN, FN ] LIKE b , a

 

《または》条件だと,複合インデックスは使用されないことに注意してください。


 複数フィールドの並び替えは,一部またはすべてのフィールドにインデックスが作成されていたとしても,常にシーケンシャル,つまりインデックスを使用しない処理になってしまいますが,複合インデックスであれば,これを高速にすることができます。ORDER BYドキュメントの例題11番と13番を参照してください。

 

 重複不可とプライマリーキー

 

v14以降,テーブルにはプライマリーキーを設定することが原則的に必須となりました。プライマリーキーがない場合,いくつかの機能が使用できないことになります。

 

 
v14以降,プライマリーキーに設定されたフィールドには,個別に設定しなかったとしても,暗示的に下記の属性が設定されるようになっています。
 
  • 重複不可
  • NULL不可
  • インデックス(タイプ: 自動)
 
v13まで,重複不可のフィールドにインデックスを設定するかどうかはデベロッパーの自由でした。しかし,プライマリーキーがv14では原則的に必須となることを見据え,v13.5以降,インデックスの設定されていない重複不可フィールドのチェックが厳格になっています。テーブルにそのようなフィールドが存在する場合,レコードを保存することはできません。つまり,重複不可のフィールドにはインデックスが設定されていなければなりません

 

関連記事

 

v14アップグレードの準備

 

自動インデックス

 

v2004まで,インデックスのタイプはBツリーだけでした。当時,ある程度のレコード数が存在するテーブルにインデックスを新作しようとした場合に《高速モード》または《標準モード》という選択肢が与えられましたが,どちらを選んだとしてもインデックスの作成方法が違うだけで,結果的に作られるインデックスは同じもの,つまりBツリーでした。

 

v2004以前に作成されたデータベースをアップグレードした場合,既存のインデックスは,すべて《自動》に変換されます。また,v14以降,新規テーブルに作られるプライマリーキーのインデックスタイプも《自動》です。

 

では《自動》とはどういうインデックスのことなのでしょうか。

 

オリビエ・デシャネル (Olivier DESCHANELS) が4D Forumsで説明しています。

 

《自動》とは,フィールドがブール型であればBツリー,それ以外であればクラスターBツリー,と考えているデベロッパーもいるようですが,そうではありません。フィールドがブール型あるいは外部キーであれば,クラスターBツリー,それ以外のケースでは,すべてBツリーインデックスが作成されます。ただ,ドキュメントにそう明記されていないことから分かるように,将来のバージョンでは変更されるかもしれません。 

 

キーワード

 

v11以降はテキスト,v12以降はピクチャにもキーワードインデックスが設定できるようになりました。キーワードインデックスは,クラスターBツリーの一種で,フィールドの値に含まれる単語それぞれがインデックスのキーとして使用されます。テキストにキーワードインデックスが設定されていれば,《キーワードを含む》比較演算子の"%"を使用してテキストフィールドを検索することができます。キーワードの一部が含まれるテキストを検索するには,"%"演算子とワイルドカードの"@"を併用します。v13以降,GET TEXT KEYWORDSでテキストをキーワードに分解することもできるようになりました。

 

ピクチャの場合,JPEGまたはTIFF画像のIPTC Keywordsメタタグの内容がインデックスの対象です。そのようなタグは,対応しているソフトウェア,または4DのコマンドSET PICTURE METADATAで追加することができます。画像にタグが付けられていれば,《猫が写っている画像》といった具合に,ピクチャをクエリすることができます。

 

v14以降,日本語版の4Dは,テキストをキーワードに分解するためにMeCabライブラリを使用するようになりました。このライブラリの詳細,またキーワードインデックスを活用した全文検索の方法については,2015年の5月と6月に盛岡・金沢・福岡・大阪・東京で開催が予定されている4D World Tour 2015 でご紹介いたします。関心のある方は,是非,ご参加ください。よろしくお願い申し上げます。