🐬

AUTO_INCREMENT は大規模システムでは使わない方がいいのか?

に公開

AUTO_INCREMENT(自動増分ID)は、小規模~中規模なシステムや単一インスタンスのDBではシンプルかつ便利ですが、大規模システムや分散システム(シャーディングなど)では注意が必要です。


AUTO_INCREMENTの大規模システムでの課題

  • スケーラビリティの問題

    • 連番IDはDBサーバーごとに一意性を保つため、トランザクションやロックが発生しやすく、高負荷時や分散環境ではパフォーマンス劣化やホットスポットの原因になります。
    • シャーディング環境では、IDの衝突や生成順の保証が難しくなります。
  • セキュリティリスク

    • 連番IDは予測が容易で、URLやAPIでIDを直接指定する場合、情報漏洩や不正アクセスのリスクがあります。
  • 型の上限

    • INT型(約21億)やBIGINT型(約922京)など型の上限に達すると、新規レコード追加ができなくなるリスクがあります。
  • IDのリセットや永続化

    • MySQL 5.xではAUTO_INCREMENT値がリセットされることがあり、一意性が損なわれる場合もあります(MySQL 8.0以降は改善)。

代替案

  • UUIDやソート可能なユニークID

    • UUIDは分散環境で一意性を保てますが、インデックスやストレージの効率が悪いため、パフォーマンスに課題があります。
    • ソート可能なユニークID(例:rs/xid、ULID、Snowflake IDなど)は、一意性・順序性・パフォーマンスのバランスが良く、大規模システムでよく使われます。
  • アプリケーション側でID生成

    • アプリケーション側で一意IDを生成し、DBにINSERTする設計も増えています。

まとめ

AUTO_INCREMENTは大規模システムや分散環境では避ける、もしくは慎重に使うべきです。
代替として、UUIDやソート可能なユニークID、アプリケーション側でのID生成が推奨されます。

Discussion