web-dev-qa-db-ja.com

mysqlはBツリー、B +ツリー、またはその両方を使用しますか?

問題を検索したところ、MysqlがB + Treeインデックスを使用していることがわかりましたが、「show index」を実行すると、取得するインデックスタイプはBtreeです。そして、私はこれでMySQLがBtreeとB + treeの両方を使用することを発見しました article 。両方を使用することが本当なら;なぜB + treeに言及せずにBtreeと名付けられているのですか?その場合、それぞれが使用されます。 2つの違いを知っているので、BツリーインデックスとB +ツリーインデックスのパフォーマンスの違いを理解するためにいくつかのクエリを実行したいと思います。これが私の2番目の質問につながります。特定のクエリを実行する際に2つの間に大きな違いがあります。そうであれば、例を挙げてください。前もって感謝します。

5
Noussa Smiley

InnoDBはBツリーではなくBツリーインデックスを使用します。 InnoDBデータ構造に関するすべての詳細については、 ここ を参照してください。 これらの図 もご覧ください。両方のリソースの作成者であるJeremy Coleは、GoogleのMySQLチームの責任者でした。

構文がB+TREEではなくBTREEになるのはなぜですか?この質問は一部のMySQLまたはMariaDBエンジニアに提起する必要がありますが、少なくとも2つの理由が考えられます。

  • B + TREEは、通常は演算子である+が含まれているため、非常に悪いキーワードです。
  • その構文はInnoDBより古いものです。おそらく存在しないISAMストレージエンジンと同じくらい古いものです。当時B-TREEが使われていた可能性が高いです。

InnoDBがBツリーを使用するとドキュメントに記載されているのはなぜですか?まあ、すべてのMySQLユーザーがB +ツリーとは何かを知っているとは限りません。これは単純化しすぎかもしれませんが、その文脈では受け入れられるようです。

あなたはB-TreeとB + Treeの違いを知っていると書いています。さまざまなパフォーマンス特性を明確にする必要があります。

  • B + Treeはソートが高速です。
  • 中央に値を挿入すると、Bツリーが高速になります。

しかし、一般に、B + Treeは優れていると考えられています。いくら?わかりませんが、桁違いではありません。

7

B+Treeは、B-Treeのようなjustバイナリ検索ツリーです。ここで、

  • 葉(バケット)には、右兄弟バケットと左兄弟バケットへのリンクがあり、ツリーを リンクリスト へのインデックスにします。通常、各バケットのサイズは、1つのディスクが読み取られるサイズです。
  • データはリーフにのみ保存されます。

参照用のB-Treeは、データをノードとリーフに格納します。スキャンにはバックトラッキングが必要なため、そのようなリンクはありません。

B+Treeの考え方は、ディスクシークの読み取りサイズを最大化することです。インデックスシークだけに関心があり、インデックススキャンに関心がない限り、B+Treeを実装するデータベースがB-Treeを使用することはほとんどありません。リンクのオーバーヘッドはそれほど大きくありません。言うまでもなく、B+ツリーのメソッドでは、同時実行のモデルが発生します。 LehmanおよびYao を参照してください。

これらの違いはすべて、同じアイデアに対する単なる最適化であることが重要です。たとえば、上記のリーマンと八尾の論文は、抽象的にB-Treeを参照しており、その後誤って(imho)、「B-treeの単純なバリアント(実際にはWedekindによって提案されたB * -treeの1つ)を検討します」と述べています。 WedekindがB + Treeを提案したと思うので、それは奇妙です。

これらの用語は非常に混乱しています。これをチェックしてください "The Ubiquitous B-Tree"published in 1979 あなたが本当に一日の無駄が欲しいなら、

おそらく、Bツリーの文献で最も誤用されている用語は、B *ツリーです。

1
Evan Carroll