Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計...
Search
yamamoto-hiroya
March 18, 2025
Technology
1
540
AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計の注意点
PHPerKaigi 2025の登壇資料です。
yamamoto-hiroya
March 18, 2025
Tweet
Share
More Decks by yamamoto-hiroya
See All by yamamoto-hiroya
パフォーマンスを改善するには仕様変更が1番はやい
yamamotohiroya
16
7k
プルリクサイズが大きいと警告してくれる君を作りました!
yamamotohiroya
1
440
安全にプロセスを停止するためにシグナル制御を学ぼう!
yamamotohiroya
0
1.7k
カンファレンスはフィードバックが大事
yamamotohiroya
1
140
ISUCONのススメ
yamamotohiroya
0
920
Other Decks in Technology
See All in Technology
技術職じゃない私がVibe Codingで感じた、AGIが身近になる未来
blueb
0
130
原則から考える保守しやすいComposable関数設計
moriatsushi
3
430
Create a Rails8 responsive app with Gemini and RubyLLM
palladius
0
120
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
1
260
脅威をモデリングしてMCPのセキュリティ対策を考えよう
flatt_security
4
1.7k
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
390
成立するElixirの再束縛(再代入)可という選択
kubell_hr
0
280
ユーザーのプロフィールデータを活用した推薦精度向上の取り組み
yudai00
0
400
AIにどこまで任せる?実務で使える(かもしれない)AIエージェント設計の考え方
har1101
3
1.1k
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.6k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.2k
Tenstorrent 開発者プログラム
tenstorrent_japan
0
310
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Raft: Consensus for Rubyists
vanstee
140
7k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Code Reviewing Like a Champion
maltzj
524
40k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
920
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
Transcript
AUTO_INCREMENTのIDカラムが オーバーフローしたらどうなるの? 〜実例から学ぶ DB設計の注意点〜 NE株式会社 やまもとひろや PHPerKaigi2025 登壇資料
自己紹介 • やまもとひろや • NE株式会社 開発部マネージャー • X: @HiroyaYamamoto1 •
Qiita: @yamamoto_hiroya • Zenn: yamamoto_hiroya • 今回NE株式会社は4名登壇! • 新卒採用もやってるので是非! ◦ https://ne-inc.jp/recruit ◦ 「NE株 採用」で検索!
突然ですが 2147483647 これ何の数字か分かりますか?
そうですね! INT型の最大値ですね! (2^31-1)
4294967295 は分かりますか?
そうですね! 符号なし(UNSIGNED) INT型の最大値ですね!
今回は実際に UNSIGNED INTのIDカラムが 上限を超えた 弊社事例を紹介します!
目次 • INT型(UNSIGNED INT)とは • 実際に起きた弊社事例 • 対応方法と学び • まとめ
• 今回はMySQLのINT型に絞ってお話しします。 参照: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html INT型(UNSIGNED INT)とは
INT型(UNSIGNED INT)とは 普通のINT (符号あり) UNSIGNED INT (符号なし) • 数値を入れるためのデータ型です。 •
赤い部分がそれぞれの範囲です。 • 通常のINTがマイナス値入るの忘れがち。 • UNSIGNEDはマイナス値入らない=符号なしとも呼ぶ • 自分用: INTは約21億、符号なしは約43億 0 -2147483647 4294967295 2147483647
実際に弊社で起きた事例 調査担当 私 以下エラーが出ているんですがどういう状況 か分かります? Duplicate entry '4294967295' for
key 'sample_table.PRIMARY'
ふむふむ どうやらsample_tableのPRIMARYの カラム(ID)が4294967295を書き込もうとし てエラーになっているみたいだね。 Duplicateなので既にそのID値は存在して いるみたい。 実際に弊社で起きた事例 調査担当 私
実際に弊社で起きた事例 調査担当 私 じゃあIDが4294967295のレコードが 悪さをしてそうだから 調査してレコード削除等をすれば いいですかね?
ん〜というか 4294967295はUNSIGNED INTの最大値 だから これもしかしてレコード上限 来ちゃってるかもね 実際に弊社で起きた事例 調査担当 私
実際に弊社で起きた事例 調査担当 私 え? UNSIGNED INTがオーバーフローすると Duplicateエラーになるんですか?
実際に弊社で起きた事例 • ある日突然以下のエラーが発生しました。 • Duplicate entry '4294967295' for key
'sample_table.PRIMARY' • データの書き込みが全て止まった。
再現テスト • 状況をローカル環境にて再現しました。 • テーブル定義は以下のものを使います。 • データは以下のようにします。
• この状態で新規レコードを追加しようとするとDuplicateエラーが再現し ました。 再現テスト
• 以下のような挙動をします。 • ID値が4294967295になった。 • 次の処理でAUTO_INCREMENTのためIDを+1しようとしたが最大値のた め4294967295のままになった。 • IDのカラムはPRIMARYのため重複できない。 •
そのため4294967295を再びINSERTしようとしてDuplicateエラーとなっ た。 • 補足: 現在のauto_increment値の 確認方法 • SHOW TABLE STATUS LIKE 'sample_table'; 解説
調査担当 私 レコードの削除をしてauto_incrementの値 をリセットする? どう対処したか 約43億のレコード削除はだいぶ時間がかか るので今回は難しそう。
調査担当 私 INT型を変えて桁数増やす? どう対処したか ALTERにだいぶ時間がかかるので今回は難 しそう。
調査担当 私 今のsample_tableをsample_table_oldと し、新しくsample_tableを作成する? どう対処したか RENAMEも新しいsample_table作成もサ クッとできる。作ったらすぐそのテーブルにレ コードが書き込まれ始める。 よし、これで行こう!
解決!
補足 • ちなみに今回の例はサービス開始し約5年で発生しました。 ◦ 1日235万レコードペース • そもそもそんな大量のデータをデータベースに持ちたいか?という観点か ら注意が必要です。 • どうしても持つ場合はBIGINTで持つと2^63乗まで持てます(約900京)
◦ 例えばこれを10年で使い切るには1日250兆のレコードが入り続ける必要があり、ほぼ使 い切らないくらい大きい上限値だと思ってもらって良いと思います。 ◦ もしBIGINTを使い切ったよっていうご経験がある方がいたら是非教えてください。
学び • AUTO_INCREMENTで • PRIMARYの • INT型の • ID値が •
上限に行くと • Duplicateエラーとなる。
まとめ • 安易なID値設計は辞めましょう。 ◦ デフォルトのINT型AUTO_INCREMENT, PRIMARYで本当に大丈夫か? • そもそもそのIDカラムは必要か? ◦ サロゲートキーか?ナチュラルキーか?
• 全て考えてIDカラムを持つとして、ものすごいレコードが入る場合は BIGINTにしましょう。 • そのテーブルは • 「どういう使われ方をするのか」 • 「どういうデータが入るのか」 • 「どれくらいの頻度で入るのか」 • これらを考えて適切なテーブル設計をしていきましょう!
None