RDBMS のインデックスの話
以前どっかで読んで、「なるほど〜」「でも必ずしも当てはまるとは限らないんじゃない」と思ったこと。
プライマリキーは HDD 上にシーケンシャルに保存されることが期待できるけど、他のインデックスはシーケンシャルになることは少ない (基本的にそうならない)。よって、HDD に格納されているデータを使って集約 (range) 演算を行う場合はプライマリキーを使うケースのほうがセカンダリインデックスを使うよりも速くなる
実際には、「プライマリキーはシーケンシャルに保存されることが期待」できるのは
- データの削除が発生しない
- データの追記が発生するテーブルが、ディスクに1個しかない
- プライマリキーは auto_increment カラムである
の3条件が満たされないとダメなんじゃないかなぁ。ただ、ディスク配置も含めてスキーマ設計あるいは SQL の最適化をすべきケースはあるだろうなと思った。
追記: メモリの場合でも TLB とかで似たような話があったりするんですかね。誰か試してないかなぁ
追記2: 自分の環境だと、InnoDB の場合、HDD のインデックスがシーケンシャルであることを期待できない場合、HDD I/O の速度は 2-3 MB程度になりるようです。シーケンシャルな場合とでは、オーダーが変わるんですね。