ホームページ  >  記事  >  データベース  >  MySQL の B ツリー インデックスとハッシュ インデックスの違いは何ですか?

MySQL の B ツリー インデックスとハッシュ インデックスの違いは何ですか?

Guanhui
Guanhuiオリジナル
2020-06-28 14:46:002753ブラウズ

MySQL における B-Tree インデックスとハッシュ インデックスの違い: 1. B-Tree インデックスは左端のプレフィックス マッチング原則をサポートしますが、ハッシュ インデックスはそれをサポートしません; 2. MyISAM と InnoDB は両方とも B-Tree をサポートします一方、ハッシュ インデックスはメモリ インデックスと NDB エンジン インデックスでのみサポートされます。

MySQL の B ツリー インデックスとハッシュ インデックスの違いは何ですか?

ハッシュ インデックス

ハッシュ インデックス構造の特殊性、その検索効率は非常に高く、インデックスルート ノードからブランチ ノード、そして最終的にページ ノードまで複数の IO アクセスが必要な B ツリー インデックスとは異なり、位置決めを一度で取得できるため、ハッシュ インデックスのクエリ効率は、ハッシュ インデックスのクエリ効率よりもはるかに高くなります。 B ツリー インデックス。

また疑問に思う人も多いと思いますが、B-Tree よりも Hash インデックスの方が効率が良いのに、皆さんも Hash インデックスを使いながら B-Tree インデックスも使ってみてはいかがでしょうか。ハッシュインデックスも同様であり、ハッシュインデックスは非常に効率的ですが、ハッシュインデックス自体の特殊性により、主に以下のような制限やデメリットも多くあります。

(1) ハッシュ インデックスは、「=」、「IN」、「<=>」クエリのみを満たすことができ、範囲クエリは使用できません。

ハッシュ インデックスはハッシュ演算後のハッシュ値を比較するため、等しい値のフィルタリングにのみ使用でき、範囲ベースのフィルタリングには使用できません。これは、対応するハッシュ アルゴリズムによる処理後のハッシュ値のサイズが大きいためです。関係がハッシュ操作前とまったく同じであることは保証されません。

(2) データの並べ替え操作を回避するためにハッシュ インデックスを使用することはできません。

ハッシュインデックスにはハッシュ計算後のハッシュ値が格納されており、ハッシュ値の大小関係がハッシュ演算前のキー値と完全に一致するとは限らないため、データベースはインデックスデータを利用してハッシュ演算を行うことができません。ソート操作は避けてください;

(3) インデックス キーの一部を使用してハッシュ インデックスをクエリすることはできません。

結合インデックスの場合、ハッシュ インデックスがハッシュ値を計算するとき、結合インデックス キーがマージされてから、ハッシュ値を個別に計算するのではなく、一緒に計算されます。そのため、前の 1 つまたは複数のインデックスは結合インデックスのキーが使用されます。クエリの場合、ハッシュ インデックスは使用できません。

(4) ハッシュインデックスはいつでもテーブルスキャンを回避できません。

ご存知のとおり、ハッシュ インデックスは、インデックス キーに対してハッシュ演算を実行した後、ハッシュ演算結果のハッシュ値と対応する行ポインタ情報をハッシュ テーブルに格納するものです。したがって、特定のハッシュ キー値を満たすレコードの数を取得したとしても、ハッシュ インデックスから直接クエリを完了することはできません。テーブル内の実際のデータにアクセスして対応する比較を行い、対応する結果。

(5) ハッシュ インデックスが多数の等しいハッシュ値に遭遇した場合、そのパフォーマンスが B ツリー インデックスのパフォーマンスよりも高いとは限りません。

選択性の低いインデックス キーの場合、ハッシュ インデックスを作成すると、同じハッシュ値に多数のレコード ポインタ情報が格納されます。このようにすると、特定のレコードを見つけるのが非常に面倒になり、テーブル データへの複数回のアクセスが無駄になり、全体的なパフォーマンスが低下します。

B ツリー インデックス

B ツリー インデックスは、MySQL データベースで最も頻繁に使用されるインデックス タイプです。アーカイブ ストレージ エンジンを除く他のすべてのストレージ エンジンは B をサポートします。 - ツリーインデックス。これは MySQL に限らず、実際には他の多くのデータベース管理システムでも、B ツリー インデックスが最も重要なインデックス タイプでもあります。これは主に、B ツリー インデックスのストレージ構造がデータ検査で重要な役割を果たすためです。

Suo Zhong は非常に優れたパフォーマンスを発揮します。

一般的に言えば、MySQL の B ツリー インデックスの物理ファイルのほとんどはバランス ツリー構造に保存されます。つまり、実際に必要なデータはすべてツリーのリーフ ノードに保存され、リーフ ノードの最短パスの長さはまったく同じなので、私たちはそれを B ツリー インデックスと呼んでいます。もちろん、さまざまなデータベース (または MySQL のさまざまなストレージ エンジン) が独自の B ツリー インデックスを保存している可能性があります。 . ストレージ構造が少し変更されます。たとえば、Innodb ストレージ エンジンの B ツリー インデックスで使用される実際のストレージ構造は実際には B ツリーであり、各

リーフ ノードでの B ツリー データ構造に基づく非常に小さな変更です。インデックスキーの関連情報に加えて、隣接する複数のリーフノードの検索効率を向上させるために、そのリーフノードに隣接する次のリーフノードを指すポインタ情報も保存されます。

推奨チュートリアル: 「MySQL チュートリアル

以上がMySQL の B ツリー インデックスとハッシュ インデックスの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。