あらかじめインデックスカラムでソートしておくことによるINSERT速度の差に関する調査(4)〜InnoDB編


 昨日の調査結果にあとから追記したのですが、【昨日の調査は MyISAM エンジンでの結果です】!   (図らずもそうなってしまいました(^^;))


 ということで InnoDB での追試。諸条件は昨日とまったく同じ。 ただしテーブル生成を行う際に、CREATE TABLE文の最後に ENGINE=InnoDB を追加したのみ、です。
 MyISAM の結果を見て「やっぱりソートしておいたほうが速い、なるほどね」と思っていた私には、驚くべき結果がでました。


結果(InnoDB)

件数 unsorted sorted
10,000 0.6173 0.6070
20,000 1.1663 1.3037
50,000 2.9893 2.9497
100,000 6.0137 6.1367
200,000 12.4970 12.8287
300,000 19.8357 19.8163
400,000 26.8140 28.9463
500,000 34.0367 34.3783
600,000 42.6510 41.8293
700,000 51.2680 51.6237
800,000 59.9727 57.2693

感想とか

 あらら。MyISAMのときとは打ってかわって、ソート済みと未ソートで差がなくなってしまいました。 InnoDB では MyISAM よりも「かしこい」インデックス構築を行っているのでしょうか。 あるいは InnoDB でのソート済の効果が出るのはもっと大きな件数になってからということなのでしょうか。
 ということでこの結果だけから言えるのは【InnoDBでは(この程度の件数では)あらかじめインデックスカラムの値でソートしてからINSERTを流し込んでも、速度的な効果はない】ということになりそうです。 
 それにしてもきれいにリニアに伸びていますね〜。

おまけ

 昨日の MyISAM で事前ソートありのものと、今日のInnoDBでの事前ソートあり、なしの計3つを同じグラフにプロットしてみました。
 これを見る範囲では InnoDBMyISAM でそれほど大きな差はないですね。双方ともかなり最高速まで高速化されていて、ディスクアクセスが律速になっているのかもしれません。




 ともあれこの2日間のエントリでわかったのは「MyISAMはインデックスを作っていくのが遅いのかもしれない。大量INSERT時にはちゅうい」ってところでしょうか。 正直なところまだ考察甘いので、みなさんの推測/推察/事実/妄想 などなどいっぱいコメント欄などで聞かせていただければと思います。





 以前遊びで測ったデータとか、これからもうちょっと見てみたい項目などがありますので、これからはあまりため込まずにどんどん(考察前でも)まずはデータをこの日記で出して行けたらと思っています。


.