web-dev-qa-db-ja.com

Bツリーとハッシュテーブル

MySQLでは、インデックスタイプはbツリーであり、bツリーの要素へのアクセスは対数償却時間O(log(n))です。

一方、ハッシュテーブルの要素へのアクセスはO(1)にあります。

データベース内のデータにアクセスするために、bツリーの代わりにハッシュテーブルが使用されないのはなぜですか?

86
JohnJohnGa

ハッシュテーブルの主キーによってのみ要素にアクセスできます。これは、ツリーアルゴリズム(O(1)の代わりに[log(n))よりも高速ですが、範囲を選択できません(--- [xおよびy)。ツリーアルゴリズムはLog(n)でこれをサポートしますが、ハッシュインデックスは完全なテーブルスキャンO(n)になります。また、通常、ハッシュインデックスの一定のオーバーヘッドは大きくなります(シータ表記の要素ではありませんが、まだ存在します)。また、ツリーアルゴリズムは通常、保守、データの増加、スケールなどが簡単です。

ハッシュインデックスは事前に定義されたハッシュサイズで機能するため、オブジェクトが格納されている「バケット」になります。これらのオブジェクトは再びループ処理され、このパーティション内で正しいオブジェクトを見つけます。

そのため、サイズが小さい場合、小さな要素のオーバーヘッドが大きくなり、サイズが大きくなるとさらにスキャンが行われます。

今日のハッシュテーブルアルゴリズムは通常、スケーリングしますが、スケーリングは非効率的です。

確かにスケーラブルなハッシュアルゴリズムがあります。それがどのように機能するかを私に聞かないでください-それも私には謎です。知る限り、彼らは再ハッシュが容易ではないスケーラブルなレプリケーションから進化しました。

呼ばれるラッシュ-[〜#〜] r [〜#〜] eplication [〜#〜] u [〜#〜] nder- [〜#〜] s [〜#〜] calable [〜#〜] h [〜#〜]アッシング。したがって、これらのアルゴリズムはラッシュアルゴリズムと呼ばれます。

ただし、インデックスがハッシュサイズと比較して許容できるサイズを超えており、インデックス全体を再構築する必要がある場合があります。通常、これは問題ではありませんが、巨大で巨大なデータベースの場合、これには数日かかる場合があります。

ツリーアルゴリズムのトレードオフは小さく、ほとんどすべてのユースケースに適しているため、デフォルトです。

ただし、非常に正確なユースケースがあり、必要なものだけを正確に把握している場合は、ハッシュインデックスを利用できます。

90
The Surrican

実際には、MySQLは次の link に従ってハッシュテーブルまたはbツリーの両方の種類のインデックスを使用しているようです。

Bツリーとハッシュテーブルの使用の違いは、前者では、=、>、> =、<、<=、またはBETWEEN演算子を使用する式で列比較を使用できることです。後者が使用されている間等値比較のみ =または<=>演算子を使用します。

59
lmiguelvargasf

ハッシュテーブルの時間の複雑さは、十分なサイズのハッシュテーブルに対してのみ一定です(データを保持するのに十分なバケットが必要です)。データベーステーブルのサイズは事前にわからないため、ハッシュテーブルから最適なパフォーマンスを得るには、テーブルを時々再ハッシュする必要があります。再ハッシュも高価です。

13
Emil Vikström

ハッシュマップも同様にスケーリングされず、マップ全体を再ハッシュする必要がある場合は高価になる可能性があると思います。