7.5. テーブル

7.5.1. 概要

GroongaのテーブルはIDとキーの対応を管理します。Groongaは4つの種類のテーブルを提供しています。 TABLE_NO_KEYTABLE_HASH_KEYTABLE_PAT_KEYTABLE_DAT_KEY です。

TABLE_NO_KEY 以外のすべてのテーブルは高速なキー→ID検索とID→キー検索の両方をサポートしています。 TABLE_NO_KEY はキーをサポートしていません。 TABLE_NO_KEY はIDだけを管理します。そのため、 TABLE_NO_KEY はID検索もキー検索もサポートしていません。

7.5.2. 特徴

以下はGroongaにあるすべてのテーブルの特性表です。(この表の中では TABLE_ プレフィックスは省略しています。)

全テーブルの特徴
Item NO_KEY HASH_KEY PAT_KEY DAT_KEY

データ構造

配列

ハッシュテーブル

パトリシアトライ

ダブル配列トライ

IDサポート

o o o o

キーサポート

x o o o

バリューサポート

o o o x

キー→ID検索速度

  • o: 速い

  • x: 遅い

- oo x o

更新速度

  • o: 速い

  • x: 遅い

ooo o o x

サイズ

  • o: 小さい

  • x: 大きい

ooo o oo x

キー変更

- x x o

共通接頭辞検索

- x o o

前方一致検索

- x o o

範囲検索

- x o o

1つのキーの最大サイズ

- 4KiB 4KiB 4KiB

最大総キーサイズ

-

4GiBまたは1TiB( flagsKEY_LARGE フラグを指定した場合)

4GiB 4GiB

最大レコード数

1,073,741,815 (2 30 - 9) 536,870,912 (2 29) 1,073,741,823 (2 30 - 1) 268,435,455 (2 28 - 1)

7.5.2.1. TABLE_NO_KEY

TABLE_NO_KEY はとても高速でとても小さいのですが、キーをサポートしていません。キーをサポートしていないテーブルは TABLE_NO_KEY だけです。

TABLE_NO_KEY を全文検索用の語彙表として使うことはできません。これは、語彙表はトークンをキーとして保存する必要があるからです。 TABLE_NO_KEY はログのようにキーのないレコードを管理するテーブルとして有用です。

7.5.2.2. TABLE_HASH_KEY

TABLE_HASH_KEY は高速ですが、共通接頭辞検索や前方一致検索といった高度な検索機能をサポートしていません。

TABLE_HASH_KEY はタグ検索のように完全一致検索用のインデックスとして有用です。

7.5.2.3. TABLE_PAT_KEY

TABLE_PAT_KEY は、小さく、高度な検索機能もサポートしています。

TABLE_PAT_KEY は全文検索用の語彙表としても有用ですし、範囲検索用のインデックスとしても有用です。

7.5.2.4. TABLE_DAT_KEY

TABLE_DAT_KEY は高速でキーの更新もサポートしていますが、サイズが大きいです。大量のレコードを保存する用途には向いていません。キーの更新をサポートしているテーブルは TABLE_DAT_KEY だけです。

TABLE_DAT_KEY はGroongaのデータベース内で使われています。Groongaのデータベースは ShortTextTokenBigram 、テーブル名などオブジェクトの名前をオブジェクトのIDに変換する必要があります。さらに、Groongaのデータベースはオブジェクト名の変更もサポートする必要があります。これらの機能は TABLE_DAT_KEY で実現されています。オブジェクト数は小さいので TABLE_DAT_KEY のサイズが大きいというデメリットは無視できます。

7.5.3. レコードID

レコードIDは自動的に割り当てられます。明示的に割り当てるレコードIDを指定することはできません。

削除されたレコードのレコードIDは再利用される可能性があります。

妥当なレコードIDの範囲は1から1073741823までです。(1も1073741823も妥当なIDです。)

7.5.4. 永続テーブルと一時テーブル

テーブルは永続テーブルまたは一時テーブルです。

7.5.4.1. 永続テーブル

永続テーブルは名前がついていてデータベースに登録されています。永続テーブルの中のレコードはテーブルやデータベースを閉じた後でも消えません。

永続テーブルは table_create コマンドで作成します。

7.5.4.2. 一時テーブル

一時テーブルには名前がありません。一時テーブルのレコードはテーブルを閉じると削除されます。一時テーブルは検索結果やソート結果、グループ(ドリルダウン)結果などを格納するために使われています。検索結果とグループ結果には TABLE_HASH_KEY が使われています。ソート結果には TABLE_NO_KEY が使われています。

7.5.5. 制限

最大レコード数は268435455です。1つのテーブルに268435456以上のレコードを追加できません。

最大キーサイズは4096バイトです。4097バイト以上の大きいキーは使うことができません。4097バイト以上の大きなサイズのデータはキーではなくカラムに保存してください。 TextLargeText 型は4097バイト以上の大きさのサイズのデータをサポートしています。

キーサイズの合計の最大値は4GiBです。キーサイズの合計が4GiBを超える場合は、テーブルを分割したり、データベースを分割したり(シャーディング)、それぞれのキーのサイズを減らしてください。

7.5.6. 参考