mysqlのデータ構造

mysqlでよく用いられるinnoDBテーブルのデータ構造は、木の葉のようになっている。

データをinsertしていくと、まず一枚の葉にデータがinsertされていく。

そして、ある数までデータが挿入されると、新規の葉を作成し、インデックスをつけて、新たにそっちの葉にデータを挿入していく。

このようなinnoDBテーブルの構造上、面白い現象が生じる。

例えば、sortでname順に整形されたようなデータの順にinsertしていくと、葉に対するデータが満タンになったら、空の新しい葉を作製し、そこにあたらにデータをinsertしていく。
それに対し、name順がランダムな状態の非整形データは、葉が満タンになった後、新規に葉が作成されるところまでは整形データと同じように振る舞うが、その後、満タンの葉の中のデータを2つに分割し、片方を新規の葉にmoveし、新規の葉に続けてデータを挿入していく。

このような仕組みになるのはなぜだか分からないが、データをinsertする際は、データをname順にsortしてから行う方が、大量のデータを扱う場合、insertや検索において効率がいいようだ。