MySQL には btree と hash という 2 つのインデックスがあることがわかりました。それらの違いを知っていますか?この記事では、MySQL の 2 つのインデックス タイプ、btree と hash の違いについて簡単に説明します。ハッシュ インデックス構造の特殊性により、ルート ノードからブランチ ノードへの複数の IO アクセスが必要な B ツリー インデックスとは異なり、インデックスの検索効率は非常に高くなります。ページ ノード、ハッシュ インデックスのクエリ効率は、B-Tree インデックスよりもはるかに高くなります。
ハッシュ インデックスは B-Tree よりもはるかに効率的であるのに、なぜ誰もが Hash インデックスを使用せずに B-Tree インデックスも使用するのかという疑問を抱く人も多いでしょう。
すべてのものには2つの側面があり、ハッシュインデックスも同様です。ハッシュインデックスは非常に効率的ですが、ハッシュインデックス自体もその特殊性により、主に次のような多くの制限と欠点をもたらします。
(1) ハッシュ インデックスは「=」、「IN」、「<=>」クエリのみを満たすことができ、範囲クエリは使用できません。
ハッシュインデックスはハッシュ演算後のハッシュ値を比較するため、対応するハッシュアルゴリズムによる処理後のハッシュ値の大小関係により、等しい値のフィルタリングにのみ使用でき、範囲ベースのフィルタリングには使用できません。ハッシュ操作前とまったく同じであるという保証はありません。
(2) データの並べ替え操作を回避するためにハッシュ インデックスを使用することはできません。
ハッシュ インデックスにはハッシュ計算後のハッシュ値が格納され、ハッシュ値の大小関係はハッシュ操作前のキー値と必ずしも同じであるとは限らないため、データベースはインデックス データを使用して並べ替え操作を回避することはできません。
(3) 部分インデックス キーを使用してハッシュ インデックスをクエリすることはできません。
結合インデックスの場合、ハッシュ インデックスのハッシュ値を計算するとき、最初の 1 つまたは複数のハッシュ値を個別に計算するのではなく、結合されたインデックス キーがマージされてからハッシュ値が一緒に計算されます。結合インデックスのインデックス キー、ハッシュ インデックスも利用できません。
(4) ハッシュインデックスはいつでもテーブルスキャンを回避できません。
以前に知ったように、ハッシュインデックスは、インデックスキーに対してハッシュ演算が実行された後、ハッシュ演算結果のハッシュ値と対応する行ポインタ情報をハッシュテーブルに格納することです。異なるインデックスキーは同じハッシュ値を持ちます。たとえ特定のハッシュ キー値を満たすレコードの数をハッシュ インデックスから直接クエリすることはできません。代わりに、テーブル内の実際のデータにアクセスして対応する比較を実行し、対応する結果を取得する必要があります。
(5) ハッシュ インデックスが多数の等しいハッシュ値に遭遇した場合、そのパフォーマンスが B ツリー インデックスのパフォーマンスよりも高いとは限りません。
選択性の低いインデックスキーの場合、ハッシュインデックスを作成すると、同じハッシュ値に関連付けられたレコードポインタ情報が多数存在します。このようにすると、特定のレコードを見つけるのが非常に面倒になり、テーブル データへの複数回のアクセスが無駄になり、全体的なパフォーマンスが低下します。
以上、btreeインデックスとハッシュインデックスの違いを5つの側面からご紹介しましたが、皆さんも理解できたと思いますので、ぜひ業務に活用していただければと思います。
関連する推奨事項:
MySQL インデックス最適化 btree ハッシュ rtree
以上がMySQL の btree インデックスとハッシュ インデックスの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。