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