†データベースが行う2つ目の例は、セカンダリインデックスです。あなたはおそらくセカンダリインデックスに精通しています。彼らはリレーショナルデータベースのパンとバターです。ショッピングカートの例をもう一度使用してみましょう(図5-4)。特定の顧客がカート内にあるすべてのアイテムを効率的に見つけるには、customer_idにインデックスが必要です。product_idにも索引を作成すると、特定の製品を含むすべてのカートを効率的に見つけることができます。これはテーブル全体をスキャンし、各インデックスの補助データ構造を作成します(図5-5)。索引は、基本表の情報を別の方法で表すデータ構造です。この場合、インデックスはキー値のような構造です。キーはインデックスを作成する列の内容で、値はこの特定のキーを含む行です。別の言い方をすると、customer_id列のインデックスを作成するために、データベースはその列に表示されるすべての値を取り、それらを辞書のキーとして使用します。値は、その値のすべての出現を指します。索引エントリ123は、customer_idが123のすべての行を指します。この索引の構成を図5-6に示します。ここでの重要な点は、基本表から索引に移動するプロセスは完全に機械的であるということです。特定のインデックスを存在させることをデータベースに伝えるだけで、それがなくなり、そのインデックスが構築されます。インデックスは、データベースに新しい情報を追加するものではなく、同じデータを別の形式で表すだけです。(別の言い方をすれば、インデックスを削除するとデータベースからデータが削除されることはありません(図2-5も参照してください)。インデックスは、特定のクエリを高速化するために存在する冗長なデータ構造です。完全に元の表から派生したものです(図5-7)。インデックスの作成は基本的に、データベースベースのテーブルを入力として使用し、インデックスを出力として生成する変換です。変換は、テーブル内のすべての行を処理し、索引付けするフィールドを選択し、そのフィールドでルックアップできるようにデータを再構成します。その変換プロセスはデータベースに組み込まれているので、自分で実装する必要はありません。特定のフィールドのインデックスを存在させることをデータベースに指示し、それを構築するすべての作業を行います。索引についてのもう一つの素晴らしい点は、基礎となる表のデータが変更されるたびに、表内の新しいデータと一致するように索引が自動的に更新されることです。元の表から索引を派生させるこの変換関数は、索引の作成時に一度だけ適用されるのではなく、連続して適用されます。多くのデータベースでは、これらのインデックスの更新は、一貫した一貫性のある方法で実行されます。それ以降のトランザクションでは、索引内のデータが基礎となる表と同じ状態で表示されます。トランザクションが中止されてロールバックされると、インデックスの変更もロールバックされます。これは私たちがよく気にしない本当に素晴らしい機能です!さらに、一部のデータベースでは、書き込みクエリの処理を続けると同時にインデックスを作成できます。CONCURRENTLYと言うことができます(図5-8)。大規模な表では、索引の作成に数時間かかることがあります。本番データベースでは、索引の作成中に表への書込みを停止する必要はありません。インデックスビルダは、アプリケーションが通常どおりデータベースを同時に読み書きする間に実行できるバックグラウンドプロセスである必要があります。データベースがこれを行うことができるという事実はかなり印象的です。結局、インデックスを作成するには、データベースはテーブルの内容全体をスキャンする必要がありますが、スキャンの実行と同時にその内容が変化しています。インデックス作成者が動くターゲットを追跡しています。最後に、データが同時に変化していたにもかかわらず、データベースはトランザクション的に一貫したインデックスで終了します。これを行うには、一貫性のあるスナップショットからインデックスを作成する必要があります。インデックス構築中にそのスナップショット以降に発生したすべての変更を追跡する必要があります。この手順は、第3章でチェンジキャプチャのコンテキスト(図3-2)で見たものと非常によく似ています。データベース外の新しいインデックス(図3-7)は、データベース内に新しいインデックスを作成することとそれほど違いはありません。これまで、データベースの2つの側面について議論しました。レプリケーションとセカンダリインデックス作成です。3番目のキャッシングに進みましょう。サーバー調整のため長時間アクセスできない状況が続き、ご迷惑をおかけして申し訳ありませんでした。現在は復旧しております。問題がありましたら、不具合報告までご連絡をお願いします。