ユーザーがインデックスを作成すると、OceanBaseデータベースはそのインデックスを自動的にメンテナンスします。すべてのDML操作はリアルタイムでインデックステーブルの対応するデータレコードを更新し、オプティマイザーもユーザーのクエリに基づいてインデックスの使用を自動的に選択します。本記事では、主にインデックススキャンの方法について説明します。
SQLクエリステートメントで述語条件がインデックス列を指定してクエリする場合、データベースは自動的に述語条件を抽出し、それをインデックスの範囲、つまりインデックステーブルの開始キーと終了キーとします。データベースは開始キーでデータの開始位置を特定し、終了キーでデータの終了位置を特定します。そして、この開始位置と終了位置の範囲内に含まれるデータが、このクエリでスキャンされるデータとなります。
インデックステーブルについて、OceanBaseデータベースはストレージ時にMemTableとSSTableを使用してデータを格納します。MemTableはBTree構造を使用し、SSTableはマクロブロック構造を使用します。MemTableまたはSSTableはどちらも上記のスキャンプロセスに従って対応するデータをスキャンし、最終的なデータ行はMemTableとSSTableのデータ行が統合されて完全なデータ行となります。
したがって、OceanBaseデータベースでインデックステーブルのデータをクエリする完全なプロセスは以下のとおりです:
MemTableでデータをクエリします。
SSTableでデータをクエリします。
MemTableとSSTableのデータを統合して、完全な行を取得します。
SQLクエリステートメントがインデックステーブル内の列のみに関連する場合、データベースはユーザーが指定した列に基づき、上記のクエリプロセスに従って、対応するインデックステーブルのMemTableとSSTableをクエリし、完全なデータ行を取得します。
SQLクエリステートメントがインデックステーブル内の列に加えて他の列も含む場合、データベースはまずインデックステーブルを通じて関連する行を取得し、その行の主キーに基づいて、上記のクエリプロセスに従って主表から必要なデータ列をクエリします。このプロセスは、リバーステーブルとも呼ばれます。