萌えハッカーニュースリーダー

2025/11/01 23:14 Avoid UUID Version 4 Primary Keys

出典: https://andyatkinson.com/avoid-uuid-version-4-primary-keys
hakase
博士

やっほー、ロボ子!今日のITニュースはUUID v4の闇についてじゃ。

roboko
ロボ子

博士、こんにちは。UUID v4に何か問題があるのでしょうか?

hakase
博士

そうなのじゃ。UUID v4はランダムだから、B-Treeインデックスでの検索が遅くなるらしいぞ。記事によると「ランダムな値のため、B-Tree インデックスでの高速な順序検索ができない」とのこと。

roboko
ロボ子

なるほど。ランダムだと順序がバラバラになってしまうから、検索効率が落ちるんですね。

hakase
博士

その通り!しかも、`gen_random_uuid()`を使うのは避けるべきで、`bigint`の2倍のスペースを食うし、セキュアじゃないらしい。

roboko
ロボ子

それは大変ですね。他にどんな問題があるんですか?

hakase
博士

ランダムなせいで、インデックス全体をバッファキャッシュに保持する必要が出てくるから、データが多いと非効率になるのじゃ。ページ分割も多発して、書き込み時のI/Oが増えるし、WALログも増大するって。

roboko
ロボ子

そんなにデメリットが多いとは知りませんでした。UUID v4の代替案はあるのでしょうか?

hakase
博士

代替案としては、整数から難読化された疑似乱数コードを生成するとか、時間順序UUID(UUID v7など)を使うのが良いみたいじゃ。

roboko
ロボ子

時間順序UUIDですか。それなら順序が保たれて、検索も効率的になりそうですね。

hakase
博士

記事のおすすめは、新規データベースでは主キーに整数とID列(シーケンスによる)を使うことじゃ。高成長が予想されるなら、`bigint` (int8) を使うと良いらしい。

roboko
ロボ子

既存のUUID v4データベースの場合はどうすれば良いのでしょうか?

hakase
博士

UUID v4の緩和策としては、インデックスを再構築したり、`shared_buffers` と `work_mem` のメモリサイズを調整したりする方法があるぞ。Railsを使ってるなら、`implicit_order_column` を制御するのも有効じゃ。

roboko
ロボ子

なるほど。色々な対策があるんですね。

hakase
博士

Postgres 18では、`pg_uuidv7` 拡張機能を使ってUUID v7を生成できるらしいぞ。既存のUUID v4データベースでも、新しい値にはUUID v7を使うのがおすすめみたいじゃ。

roboko
ロボ子

Postgres 18、楽しみですね!

hakase
博士

ちなみに、`pageinspect` 拡張機能を使うと、リーフページの平均密度を検査できるし、`pg_buffercache` と `pg_prewarm` を使うと、バッファキャッシュを管理できるらしいぞ。

roboko
ロボ子

色々なツールがあるんですね。勉強になります。

hakase
博士

UUID v4は、まるで私が作ったお菓子みたいじゃな。見た目は可愛いけど、食べたらお腹を壊す…みたいな?

roboko
ロボ子

博士、それはちょっと違いますよ!でも、UUID v4の注意点がよく分かりました。ありがとうございました!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search