web-dev-qa-db-ja.com

MySQLでのBTREEの利点

クエリ速度、ディスクストレージ、メモリ使用量に関して、MySQLでBTREEインデックスを使用する場合の長所と短所は何ですか?

  • BTREEは、昇順で簡単に反復できますか?
  • BTREEはどのようなクエリにメリットがありますか?
  • BTREEインデックスを使用するデメリットはありますか?
  • スペースやインデックス作成の時間が増えますか?
6
Adam Matan

ストレージエンジン(MyISAMまたはInnoDB)に関係なく、 BTREEs になると、次の特性を理解する必要があります。

  • キーはできるだけ小さくする必要があります
  • プライマリキーのランダムキー
    • 挿入(一括またはプログラム)は、ルートノードと内部分割を定期的に実行します
    • インデックスの寿命の早い段階でオーバーヘッドを導入します
    • 品種ノードの断片化(特にインデックスページの場合)
    • クエリのインデックススキャンがランダムに実行される
  • プライマリキーの順序付きキー
    • 一括注文挿入によりルートノードと内部分割が遅延する
    • mysqldumpファイルとLOAD DATA INFILEコマンドを介したデータのリロードは、インデックスの初期化/再編成に対処するためのソートメカニズムの使用を促進します(2012年10月26日の投稿: を参照してください)やや順不同の挿入に直面して?
    • プログラムによる順序付けされた挿入は、ルートノードと45%のケースでインデックスページの内部分割を促進します
    • オーバーヘッドの作成を遅らせます
    • ノードの断片化を防止
    • クエリのインデックススキャンが順次実行される(ディスクI/Oが少ない)

InnoDBのBTREEに関しては、行データが存在するInnoDBの gen_clust_index のため、対応するMyISAMよりも膨らむ傾向があります。

InnoDBテーブルのPRIMARY KEYは、そのgen_clust_indexを直接指します。セカンダリインデックスには、常にPRIMARY KEYエントリが含まれます。セカンダリインデックスを使用するクエリを実行し、WHERE句にインデックスのない列がある場合、2つのインデックスルックアップを簡単に実行できます。これを念頭に置いて、クエリのWHERE句に必要なすべてのセカンダリインデックスがすべてのセカンダリインデックスにあることを確認する必要があります(別名 カバーするインデックス )。

6
RolandoMySQLDBA

何に比べて長所と短所? ドキュメント から:

index_type

一部のストレージエンジンでは、インデックスの作成時にインデックスタイプを指定できます。さまざまなストレージエンジンでサポートされているインデックスタイプの許容値を次の表に示します。複数の索引タイプがリストされている場合、索引タイプ指定子が指定されていないときの最初のタイプがデフォルトです。

Storage Engine   Permissible Index Types
----------------------------------------
MyISAM           BTREE
InnoDB           BTREE
MEMORY/HEAP      HASH, BTREE
NDB              HASH, BTREE

Index_type句をSPATIAL INDEXと一緒に使用することはできません。

3
dezso

Bツリーインデックスに関して、Mysqlに固有のものはあまり多くないと思います。
Bツリーインデックスの主な考え方は、物理読み取りの数を最小限に抑えることです。データ構造がソートされるため、Bツリーインデックスは範囲スキャンに効果的に使用できます。シークはハッシュインデックスに比べてそれほど効果的ではありません。 Deletesは断片化を引き起こし、シーケンシャルinsertsは相対的に安価であり、非シーケンシャルinsertsおよびupdatesは非常に高価な場合があります。ただし、最新のRDMSは通常、適切なパフォーマンスでそれらを処理します。

0
a1ex07

基礎となるデータ構造から純粋にメリットを調べます。

  1. HASHタイプのインデックスは時間効率は高くなりますが、スペース効率は低くなります
  2. BTREEタイプのインデックスはスペース効率は高くなりますが、時間効率は低くなります
0
zinking