複合キーと順番

CREATE TABLE文内で、PRIMARY KEY(column1, cokumn2, ....)とかくと、複合キーができるが、結構順番が重要だ。
でも、毎回重要なわけではない。


WHERE区で column1 = 'AAA' and column2 = 'bbb' みたいに完全一致で指定するだけの場合は関係ない。

でも、ORDER BY的な要素が絡むと、すごく重要。
上のケースでは、ORDER BY column1, column2 と指定した場合には、インデックスがもろに効いてくる。

でも、ORDER BY column2 とか、 ORDER BY column2, column1 とかのケースだとかなり痛い。
この場合は、テーブルスキャンになってしまう。
なぜならば、複合キーで読み込む順番は ORDER BY column1, column2の順だからだ。


あと、気をつけたいのは、 WHERE column2 = 'bbb' だけ指定しておいて、これにHitする件数がすごく多いとき。
この場合、内部的にストレージエンジンを使うときに一度に結果を取れないから、キャッシングして、結果をバケツリレー形式で持ってくる動作をするケースがある。
このときに、2回同じものを読まないように、何かの形で整列しなくてはならないが、ここで、インデックスが使えないと、キャッシュが読み終わって、また、データを取りに行くときに、また、全体テーブルスキャンで一度スキャンが発生してしまう。

これには、要注意だ。