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