UUID v4 を主キーにするとなんで遅いかを解説している以下の動画を見た
非常にわかりやすい動画でとても勉強になった
結論
- UUID v4 がなんで遅いかはランダムで作られるから
- なぜランダムが遅いかというと、挿入時インデックスキーが順番通りでないから Page 分割が大変になる
- すでに並んでいた順の間に入れようとした時にPage生成が発生する
- また、シーケンスに比べて
- 文字列なので比較コストが高い
- インデックスキーのサイズが大きい
何がどれくらい遅いか
動画では冒頭に説明されていた
- UUID v4を主キーにするとinsertが遅い
- MySQL3000万レコードを挿入し続けて、400万レコードのinsertから差がで始めて0.5secくらいかかる(約5倍)
- PostgreSQLは1000万くらいでシーケンスと差がで始める
- selectだと count(*) が顕著に遅い
- インデックスサイズが大きいから(36文字に対して、シーケンシャルは1からなので)
致命的ではないが、以下で気にし始める
- 1テーブルあたり数億レコードある場合
- 数千万レコードくらいないと差は感じにくい
- 追加削除更新が秒間、数百トランザクション以上ある場合