select ステートメントに一致するものを見つけるために、データベースは実際に何をしますか?
率直に言って、それは力ずくの問題です。簡単に言えば、データベース内の各候補レコードを読み取り、式をフィールドに一致させます。そのため、「select * from table where name = 'fred'」を実行すると、文字通り各レコードが実行され、「name」フィールドが取得され、それが「fred」と比較されます。
ここで、「table.name」フィールドがインデックス化されている場合、データベースは最初にインデックスを使用して (可能性は高いですが、必ずしもそうとは限りません)、実際のフィルターを適用する候補レコードを見つけます。
これにより、式を適用する候補レコードの数が減ります。それ以外の場合は、「テーブル スキャン」と呼ばれるもの、つまりすべての行を読み取るだけです。
しかし、基本的に、候補レコードを見つける方法は、実際のフィルター式を適用する方法とは別のものであり、明らかに、実行できる巧妙な最適化がいくつかあります。
データベースは、複数の "where key1 = key2" ステートメントを使用したクエリと結合をどのように異なる方法で解釈しますか?
さて、結合を使用して、フィルターが適用される新しい「疑似テーブル」を作成します。これで、フィルタ基準と結合基準ができました。結合基準を使用してこの「疑似テーブル」を作成し、それに対してフィルターを適用します。ここで、結合を解釈するとき、これもフィルターと同じ問題です。「疑似テーブル」のサブセットを構築するためのブルート フォース比較とインデックス読み取りです。
データベースはすべてのメモリをどのように格納しますか?
優れたデータベースの鍵の 1 つは、その I/O バッファーをどのように管理するかです。ただし、基本的にはRAMブロックをディスクブロックに一致させます。最新の仮想メモリ マネージャーを使用すると、より単純なデータベースは、そのメモリ バッファー マネージャーとして VM にほとんど依存することができます。ハイエンド DB は、これらすべてを自分たちで行います。
インデックスはどのように保存されますか?
B+Trees は通常、調べる必要があります。これは、何年も前からある簡単なテクニックです。その利点は、ほとんどのバランス ツリーと共有されます。ノードへの一貫したアクセスに加えて、すべてのリーフ ノードがリンクされているため、ノードからノードへキーの順序で簡単にトラバースできます。したがって、インデックスを使用すると、行はデータベース内の特定のフィールドに対して「並べ替えられた」と見なすことができ、データベースはその情報を活用して最適化に役立てることができます。これは、たとえば、インデックスにハッシュ テーブルを使用する場合とは異なります。ハッシュ テーブルでは、特定のレコードにすばやくアクセスすることしかできません。B ツリーでは、特定のレコードだけでなく、並べ替えられたリスト内のポイントにすばやく到達できます。
データベースに行を格納してインデックスを作成する実際のメカニズムは、非常に単純明快であり、よく理解されています。ゲームはバッファを管理し、SQL を効率的なクエリ パスに変換して、これらの基本的なストレージ イディオムを活用します。
次に、ストレージのイディオムに加えて、マルチユーザー、ロック、ロギング、およびトランザクションの複雑さが全体的に存在します。