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


101

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

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

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


9
ハッシュテーブルは範囲クエリをサポートせず、操作中にスムーズに拡大または縮小できません。
hmakholmがモニカに残った

3
@HenningMakholm範囲クエリを必要としない列をハッシュしないのはなぜですか?
Pacerier

回答:


113

ハッシュテーブルの主キーによってのみ要素にアクセスできます。これは、より高速な(ツリーアルゴリズムと比べてO(1)の代わりにlog(n))、しかし、あなたは(範囲を選択することができない間にすべてのものをxしてy)。ツリーアルゴリズムはこれをサポートしてLog(n)いますが、ハッシュインデックスはテーブル全体をスキャンする可能性がありますO(n)。また、ハッシュインデックスの一定のオーバーヘッドは通常、大きくなります(これはシータ記法には影響しませんが、それでも存在します)。また、ツリーアルゴリズムは通常、維持、データの増加、スケーリングなどが容易です。

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

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

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

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

そのRUSH - R eplication U nder S calable H ashingと呼ばれるため、これらのアルゴリズムはRUSHアルゴリズムと呼ばれます。

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

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

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


インデックスの再構築について詳しく説明できますか?インデックスが再構築されている間、x日間、テーブルはその期間中、まったく使用できなくなりますか?
Pacerier

これは、使用しているデータベースシステムによって異なります。質問は理論的な側面だけをカバーしました。一般的なデータベースシステムの実装の詳細について本当に知りません。しかし、通常、最初のインデックスがまだ使用されている間に2番目のインデックスを作成できるため、これは
当てはまりません

「要素には主キーでのみアクセスできます」-主キーでも他のタイプのインデックスでも、インデックス権限を持つ列の値を意味しますか?
マークフィッシャー

87

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

Bツリーおよびハッシュテーブルを使用しての違いは前者が使用できるようにすることである列比較を =、>、> =、<、<=、またはオペレータとの間には、後者の中に使用される使用式でのみのために =または<=>演算子を使用する等価比較


9
それは不公平です。ベストアンサーのスコアが最も低くなります。
АндрейБеньковский

6
これはまさに私が探していたものです。テクニカル分析ではなく、クエリへの影響を気にしました。
Ben Dehghan 2017年

うん!この回答が最も役に立ちました。
ロン・ロス

長い間感謝しておりますが、この答えは私にも役立ちます。
Reham Fahmy、2018

14

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


2
dbがオンラインのときに再ハッシュを実行できますか?または、すべてを再ハッシュするためにテーブルをロックする必要がありますか?
ペーチェリエ2012

1
Pacerier、MySQLはハッシュインデックスをサポートしていません。理論的にはデータベースがオンラインの状態でインデックスを再ハッシュすることは可能ですが(古いインデックスを使用し続け、新しいインデックスを作成し、完了したら新しいインデックスに切り替えます)、MySQLが実装するとどうなるかわかりませんハッシュインデックス。
EmilVikström12年

3
MySQLはハッシュインデックスを正しくサポートしますか?:dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Pacerier

あなたは正しいようです。それは私にとってニュースでした!私は開発に遅れずについていくように努めなければなりません:-)それからあなたはあなたがあなたの質問に答えるのが私よりはるかに上手ですが、私が言ったように、それは理論的に可能です。
EmilVikström12年

ところで、「btreeはディスクに簡単にページアウトできますが、ハッシュテーブルはできない」と言うのはなぜですか?単純なキー検索で十分なので、ハッシュテーブルをディスクに保存できませんでしたか?
Pacerier、2015


0

Pick DB / OSはハッシュに基づいており、うまく機能しました。最近は、効率的なスパースハッシュテーブルをサポートするためのより多くのメモリと、適度な範囲クエリをサポートするための冗長ハッシュを使用しているので、ハッシュはまだその場所にあるかもしれません(ワイルドカードや正規表現など、範囲以外の類似性マッチングの他の形式を持っている人もいます) )。また、メモリ階層の速度差が大きい場合は、衝突チェーンを連続させるためにコピーすることをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.