33

USING BTREE句なしでインデックスを作成します。BTREEインデックスを使用する利点はありますか?

CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`);
4

5 に答える 5

53

まず、使用するストレージ エンジンによっては、選択の余地がない場合があります (たとえば、InnoDB はインデックスに BTREE のみを使用しています)。

また、BTREE はほとんどのストレージ エンジンのデフォルトのインデックス タイプです。

現在... 別のインデックス タイプを使用すると、パフォーマンスが向上する場合があります。HASH インデックスが役立つ場合があります (比較的まれなケースです)。HASH インデックスが作成されると、BTREE インデックスも作成されることに注意してください。これは、ハッシュ インデックスが等価述語しか解決できないという事実が原因の 1 つです。(WHERE Price > 12.0 などの条件は、ハッシュ インデックスでは処理できませんでした)。

つまり、BTREE を暗黙的に (BTREE が使用されるストレージのデフォルトである場合)、または明示的に使用し続けます。他のタイプのインデックスについて学習し、それらが必要になることを理解してください。

編集: (別のインデックス タイプを使用できるケースを検索する場合)実際には、 RTREEインデックス
のケースはかなり単純です。これらは、MySQL では、"SPATIAL" データベースのコンテキスト、つまり、GIS モデル内のポイントやその他のオブジェクトなどの地理位置コンテキストを含むデータベースでのみサポートされます)。

HASH インデックスはより一般的 (特定のアプリケーションやデータ型に限定されない) であり、通常、ハッシュの直感的な理解に従って、古いが忠実な BTREE よりも優れたパフォーマンスを発揮する時期についてヒントを得ることができます。前に示したように、これは通常、等しい述語で検索される列を意味します。MySQL 内での効果的な実装次第では、比較的短いルックアップ テーブルなどでもメリットがあると思います。

于 2009-11-06T14:30:12.597 に答える
28

BTREE はデフォルトの索引方法です。安全に省略できます。

于 2009-11-06T14:27:10.917 に答える
8

使用しているストレージ エンジンによって異なります。ほとんどの場合、BTREE がデフォルトであるため、指定しても実際には何も変わりません。MEMORY/HEAP や NDB などのストレージ エンジンでは、デフォルトで HASH インデックスが使用されます。

詳細については、こちらを参照してください。

B ツリーまたは HASH インデックスがパフォーマンスの観点から有利かどうかは、データとそのアクセス方法によって異なります。クエリが正確に 1 つの行または分散した個々の行をターゲットにすることがわかっている場合は、HASH インデックスが役立つ場合があります。それ以外は、データがソートされているため、範囲クエリや複数行を返すクエリがより効率的になるため、一般的に BTREE インデックスを好みます。

于 2009-11-06T14:29:52.180 に答える
3

バランスの取れたツリーを検索するということは、すべての葉が同じ深さにあることを意味します。滑走路ポインターのオーバーヘッドはありません。実際、B ツリーが大きくても、特定のキーを見つけるために少数のノードを取得する必要があります。たとえば、ノードあたり 50 個のキーを持つ 10,000,000 個のキーの B ツリーでは、キーを見つけるために 4 つ以上のノードを取得する必要はありません。B ツリーは、インデックス内のデータへの迅速なアクセスを可能にする、インデックス用の特別なデータ構造形式です。このデータ構造のプロパティの 1 つは、インデックスが常に均衡していることです。つまり、最下位レベルの各ノードは等距離です。ツリーの最上位ノードまたはルート ノードから。インデックスの各側には同じ数のノードがあります。最下位レベルのノードはリーフ ノードと呼ばれます。他のすべてのノードはブランチ ノードと呼ばれます。分岐点他のブランチまたはリーフ ノードに。リーフ ノードには、インデックス付きの列の値と、それらの値を持つ個別の行を指す行 ID が格納されます。実際の分布は、B ツリーの値の各範囲内のデータ値の数に依存し、全体的な目標は、特定の値に到達するためにトラバースする必要があるレベルの数を減らすことです。B ツリー構造の利点は次のとおりです。

  1. すべてのリーフ ブロックは同じ深さ (値の数) です。
  2. 通常、B ツリーの高さはかなり小さいです。場合によっては、ルート ノードが唯一のリーフ ノードであり、高さが 1 です。テーブルにさらに多くの行が挿入されると、これに対応するためにインデックスを大きくする必要があります。 100 万行を超えるテーブルでは、B ツリー IDEX の高さは通常 3 です。探している行のrowid、これは非常に効率的です。
  3. ランダムに入力されたデータの場合、B-tree は自動的に残高を維持します。実際、B-tree はどのようなデータが入力されても残高を維持します。
  4. B ツリー インデックスのすべてのブロックは (平均で) 4 分の 3 埋まっているため、再構築せずに挿入できます。5.B ツリーは、すべてのタイプの選択に対して優れたパフォーマンスを提供します。6.挿入、更新、および削除は、B-tree 構造で効率的な傾向があります。7.B ツリーのパフォーマンスは、テーブルが小さいものから大きいものに変わっても最適なままです。
于 2013-06-11T13:16:19.947 に答える
1

簡単な答えは、SQL がそのフィールドで LIKE ステートメントを使用している場合、BTREE インデックスを使用する方がハッシュ インデックスよりも優れているはずです。そのフィールドに対して等号 (=) ステートメントを使用している場合は、ハッシュ インデックスを使用します。

于 2014-10-21T19:41:35.433 に答える