[解決済み] B-Treeとハッシュテーブルの比較
質問
MySQL では、インデックスタイプは b-tree であり、b-tree の要素へのアクセスは対数償却時間である。
O(log(n))
.
一方、ハッシュテーブルの要素にアクセスするのは
O(1)
.
データベース内のデータにアクセスするために、B-treeの代わりにハッシュテーブルを使用しないのはなぜですか?
どのように解決するのですか?
ハッシュテーブルでは、主キーによってのみ要素にアクセスすることができます。
これは、ツリーアルゴリズムを用いるよりも高速です (
O(1)
の代わりに
log(n)
) を選択することはできませんが、範囲指定 (
の間にあるもの全て
x
と
y
).
ツリーアルゴリズムでは、これを
Log(n)
一方、ハッシュインデックスでは、フルテーブルスキャンになる可能性があるため
O(n)
.
また、ハッシュインデックスの定数オーバーヘッドは通常より大きくなります (
はシータ表記では要因になりませんが、それでも存在します。
).
また、ツリー アルゴリズムは通常、メンテナンスが容易で、データと共に成長し、スケールアップすることができます。
ハッシュインデックスはあらかじめ定義されたハッシュサイズで動作するため、最終的にはオブジェクトが格納されるいくつかのバケットを持つことになります。これらのオブジェクトは、このパーティション内で本当に正しいものを見つけるために、再度ループされます。
そのため、サイズが小さいと小さな要素に対して多くのオーバーヘッドが発生し、サイズが大きいとさらなるスキャンが発生します。
現在のハッシュテーブルのアルゴリズムは通常スケールしますが、スケーリングが非効率になることがあります。
確かにスケーラブルなハッシュアルゴリズムは存在します。それがどのように機能するかは聞かないでください - 私にとっても謎です。AFAIKは、再ハッシュが容易でないスケーラブルなレプリケーションから発展したものです。
と呼ばれるものです。 RUSH - R エンプリケーション U 下 S キャラクタブル H のようなアルゴリズムがあり、これをRUSHアルゴリズムと呼んでいます。
しかし、インデックスがハッシュサイズと比較して許容できる大きさを超え、インデックス全体を再構築する必要がある場合があります。通常、これは問題ではありませんが、巨大な巨大なデータベースでは、これは何日もかかることがあります。
木アルゴリズムのトレードオフは小さく、ほとんどすべてのユースケースに適しているため、デフォルトで使用されています。
しかし、もしあなたが非常に正確なユースケースを持っていて、何が、そして何が必要とされるのかだけを正確に知っているならば、ハッシュインデックスを利用することができます。
関連
-
[解決済み】DynamoDB : 提供されたキー要素がスキーマと一致しません。
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
-
[解決済み] MySQLでibdata1ファイルを縮小/パージする方法
-
[解決済み] エラー 1698 (28000)。ユーザー 'root'@'localhost' のアクセスが拒否されました。
-
[解決済み】Redisに使用されている基礎的なデータ構造は何ですか?
-
[解決済み】外部キーを持つテーブルのカラムはNULLにできる?
-
[解決済み] なぜ、unordered_setの代わりにsetを使うのでしょうか?
-
[解決済み] ハッシュテーブルとトライ(プレフィックスツリー)のどちらを選べばいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLデータベース・インデックスの左端一致の原則
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
SQL集計、グループ化、ソート
-
mysqlのデータ圧縮性能比較 詳細
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?