私はデータベースにかなり慣れていないので、これがばかげた質問であれば許してください。
現代のデータベースでは、インデックスを使用して行にアクセスすると、O(1) の複雑さになると思います。しかし、別の列を選択するクエリを実行すると、O(1) または O(n) になりますか? データベースはすべての行を反復処理する必要がありますか?それとも、列ごとに並べ替えられたリストを作成しますか?
私はデータベースにかなり慣れていないので、これがばかげた質問であれば許してください。
現代のデータベースでは、インデックスを使用して行にアクセスすると、O(1) の複雑さになると思います。しかし、別の列を選択するクエリを実行すると、O(1) または O(n) になりますか? データベースはすべての行を反復処理する必要がありますか?それとも、列ごとに並べ替えられたリストを作成しますか?
答えはわかりませんが、big-O 表記法は、任意に大きいデータセット サイズのパフォーマンスを示すだけであることを覚えておいてください。
たとえば、データベース パフォーマンスのボトルネックは通常、ディスク シークです。したがって、作業データセットをメモリに保持できれば、パフォーマンスが大幅に向上します。Big-O 表記は、そのような最適化については何も教えてくれません。なぜなら、それらは有限のデータセットにのみ関連するからです。
B ツリーは、バイナリ ツリーの複雑さである O(logN) を生成しません。
B ツリーは、ノードごとにブロック全体を持つように構成されているため、ノードが見つかると、1 回の I/O 操作でブロック全体を読み取ることができます。
ノードあたりの項目数 = ブロック係数 (#records/block){bfr} の場合、B ツリー最適化検索では、O(N) I/ ではなく O(log bfr÷2 +1 N) I/O 操作が生成されます。キーでレコードを検索する O 操作。
データベースごとに、さまざまな種類のインデックス、さまざまな実行計画、およびさまざまな実装があります。リレーション データベースのコードのほとんどは、検索最適化アルゴリズムにあります。あなたの質問に対する答えは一つではありません。クエリがどのように実行されるかを知りたい場合は、ツールを使用して実行計画を視覚化できます。
インデックスのないテーブル、データは非順序構造に保存されます。いくつかのデータを検索したい場合、「スキャン」を使用して、テーブルの最初から最後まですべてのデータをチェックします。
ケース 1: インデックスなしのクエリ テーブル、クエリ 1 レコード、SQL クエリ プラン ステップ: 「テーブル スキャン」すべてのデータ、O(N)
ケース 2: インデックスなしのクエリ テーブル、多数のレコードのクエリ、SQL クエリ プラン ステップ: 「テーブル スキャン」すべてのデータ、O(N)
インデックス付きのテーブル、データは B ツリー構造に保存されます。これは、(インデックス付きの列で) 1 つのデータを検索する場合、B ツリー構造を使用してデータを検索します。
ケース 3: インデックス付きの列を含むクエリ テーブル、クエリ 1 レコード、SQL クエリ プラン ステップ: "インデックス シーク"、O(LogN)
ケース 4: インデックス付きの列でテーブルをクエリし、多くのレコードをクエリし、
2 可能な場合、SQL クエリ オプティマイザーは "インデックス統計" を使用して、どのアクション ステップを使用する方が高速かを計算して判断します。