Category: PostgreSQL
-
PostgreSQLでauto increment VS UUID VS ULIDのパフォーマンス比較
ID(プライマリーキー)の採番方法については、主にSequential(auto increment)とUUIDv4の2つの方法があります。UUIDはセキュリティ面などでの利点がありますが、生成が時系列順ではなくB-treeとの相性が悪いためパフォーマンスに問題があることがあります。そのため、タイムスタンプ情報を用いて時系列順に採番できるUUIDv6、UUIDv7、UUIDv8がIETFによって提案されています。v6はタイムスタンプがグレゴリオ暦ベース、v7はUnix Time Stampベース、v8は独自仕様ということですので、特に理由がなければv7を使うのが良さそうです。また、同様に時系列順に採番できるものとしてULIDがオープンソースで公開されています。今回は、Sequential、UUIDv4、UUIDv7、ULIDの4つについてPostgresSQLでパフォーマンスを測定してみました。 各ID生成方法の概要 画像はこちらから引用しました。 Sequential 特徴 メリット UUIDv4 特徴 メリット UUIDv7 特徴 メリット ULID 特徴 メリット 実験方法 環境 OS: Ubuntu 20.04.6 LTS CPU: Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz Core: 1 Mem: 1GB PostgreSQL: 12.14 (Ubuntu 12.14-0ubuntu0.20.04.1) データ データベースの構造は以下になります。ユーザ一覧テーブル、ブログ記事一覧テーブル、両者の交差テーブルがあります。 計測方法 計測にはpgbenchコマンドを使用しました。 c: コネクション数t: トランザクション数 INSERTは何度も実行できないため、「-c 1 -t 1」で測定しています(実質1度きりの測定)。 SELECT, JOINに関しては「-c 3 -t 1000」で測定しています。これは3人のユーザから同時にアクセスがあり、それぞれのユーザに対して1000件ずつトランザクションが走るようなシミュレーションになります。 実行すると以下が出力されます。…