8.5. テーブル¶
8.5.1. 概要¶
GroongaのテーブルはIDとキーの対応を管理します。Groongaは4つの種類のテーブルを提供しています。 TABLE_NO_KEY 、 TABLE_HASH_KEY 、 TABLE_PAT_KEY 、 TABLE_DAT_KEY です。
TABLE_NO_KEY 以外のすべてのテーブルは高速なキー→ID検索とID→キー検索の両方をサポートしています。 TABLE_NO_KEY はキーをサポートしていません。 TABLE_NO_KEY はIDだけを管理します。そのため、 TABLE_NO_KEY はID検索もキー検索もサポートしていません。
8.5.2. 特徴¶
以下はGroongaにあるすべてのテーブルの特性表です。(この表の中では TABLE_ プレフィックスは省略しています。)
NO_KEY | HASH_KEY | PAT_KEY | DAT_KEY | |
---|---|---|---|---|
データ構造 |
配列 |
ハッシュテーブル |
パトリシアトライ |
ダブル配列トライ |
IDサポート |
o | o | o | o |
キーサポート |
x | o | o | o |
バリューサポート |
o | o | o | x |
キー→ID検索速度
|
- | oo | x | o |
更新速度
|
ooo | o | o | x |
サイズ
|
ooo | o | oo | x |
キー変更 |
- | x | x | o |
共通接頭辞検索 |
- | x | o | o |
前方一致検索 |
- | x | o | o |
範囲検索 |
- | x | o | o |
8.5.2.1. TABLE_NO_KEY¶
TABLE_NO_KEY はとても高速でとても小さいのですが、キーをサポートしていません。キーをサポートしていないテーブルは TABLE_NO_KEY だけです。
TABLE_NO_KEY を全文検索用の語彙表として使うことはできません。これは、語彙表はトークンをキーとして保存する必要があるからです。 TABLE_NO_KEY はログのようにキーのないレコードを管理するテーブルとして有用です。
8.5.2.2. TABLE_HASH_KEY¶
TABLE_HASH_KEY は高速ですが、共通接頭辞検索や前方一致検索といった高度な検索機能をサポートしていません。
TABLE_HASH_KEY はタグ検索のように完全一致検索用のインデックスとして有用です。
8.5.2.3. TABLE_PAT_KEY¶
TABLE_PAT_KEY は、小さく、高度な検索機能もサポートしています。
TABLE_PAT_KEY は全文検索用の語彙表としても有用ですし、範囲検索用のインデックスとしても有用です。
8.5.2.4. TABLE_DAT_KEY¶
TABLE_DAT_KEY は高速でキーの更新もサポートしていますが、サイズが大きいです。大量のレコードを保存する用途には向いていません。キーの更新をサポートしているテーブルは TABLE_DAT_KEY だけです。
TABLE_DAT_KEY はGroongaのデータベース内で使われています。Groongaのデータベースは ShortText や TokenBigram 、テーブル名などオブジェクトの名前をオブジェクトのIDに変換する必要があります。さらに、Groongaのデータベースはオブジェクト名の変更もサポートする必要があります。これらの機能は TABLE_DAT_KEY で実現されています。オブジェクト数は小さいので TABLE_DAT_KEY のサイズが大きいというデメリットは無視できます。
8.5.3. レコードID¶
レコードIDは自動的に割り当てられます。明示的に割り当てるレコードIDを指定することはできません。
削除されたレコードのレコードIDは再利用される可能性があります。
妥当なレコードIDの範囲は1から268435455までです。(1も268435455も妥当なIDです。)
8.5.4. 永続テーブルと一時テーブル¶
テーブルは永続テーブルまたは一時テーブルです。
8.5.4.1. 永続テーブル¶
永続テーブルは名前がついていてデータベースに登録されています。永続テーブルの中のレコードはテーブルやデータベースを閉じた後でも消えません。
永続テーブルは table_create コマンドで作成します。
8.5.4.2. 一時テーブル¶
一時テーブルには名前がありません。一時テーブルのレコードはテーブルを閉じると削除されます。一時テーブルは検索結果やソート結果、グループ(ドリルダウン)結果などを格納するために使われています。検索結果とグループ結果には TABLE_HASH_KEY が使われています。ソート結果には TABLE_NO_KEY が使われています。
8.5.5. 制限¶
最大レコード数は268435455です。1つのテーブルに268435456以上のレコードを追加できません。
最大キーサイズは4096バイトです。4097バイト以上の大きいキーは使うことができません。4097バイト以上の大きなサイズのデータはキーではなくカラムに保存してください。 Text と LargeText 型は4097バイト以上の大きさのサイズのデータをサポートしています。
キーサイズの合計の最大値は4GiBです。キーサイズの合計が4GiBを超える場合は、テーブルを分割したり、データベースを分割したり(シャーディング)、それぞれのキーのサイズを減らしてください。