サロゲートAUTO_INCREMENT
が痛む一般的なケース:
一般的なスキーマ パターンは、多対多のマッピングです。
CREATE TABLE map (
id ... AUTO_INCREMENT,
foo_id ...,
bar_id ...,
PRIMARY KEY(id),
UNIQUE(foo_id, bar_id),
INDEX(bar_id) );
特に InnoDB を使用する場合、このパターンのパフォーマンスははるかに優れています。
CREATE TABLE map (
# No surrogate
foo_id ...,
bar_id ...,
PRIMARY KEY(foo_id, bar_id),
INDEX (bar_id, foo_id) );
なんで?
- InnoDB のセカンダリ キーには追加のルックアップが必要です。ペアをPKに移動することにより、これは一方向で回避されます。
- セカンダリ インデックスは「カバーする」ため、追加のルックアップは必要ありません。
id
このテーブルは、インデックスが 1 つ削除されているため、小さくなっています。
別のケース (国):
country_id INT ...
-- versus
country_code CHAR(2) CHARACTER SET ascii
初心者は、country_code をINT
「自然な」2 バイトの、ほとんど変化しない 2 バイト文字列を使用する代わりに、4 バイトに正規化することがよくあります。より速く、より小さく、より少ない JOIN で、読みやすくなります。