# 7.5. テーブル

## 7.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検索もキー検索もサポートしていません。

## 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（ flags に `KEY_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のデータベースは `ShortText` や `TokenBigram` 、テーブル名などオブジェクトの名前をオブジェクトの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バイト以上の大きなサイズのデータはキーではなくカラムに保存してください。 `Text` と `LargeText` 型は4097バイト以上の大きさのサイズのデータをサポートしています。

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

## 7.5.6. 参考

- table_create