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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Postgres 18、楽しみですね!

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

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

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

博士、それはちょっと違いますよ!でも、UUID v4の注意点がよく分かりました。ありがとうございました!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
