データベース(RDB)を理解できるようになる動画 / UUIDを主キーにすると遅い?

Поділитися
Вставка
  • Опубліковано 2 січ 2025

КОМЕНТАРІ • 49

  • @Pyonsuke
    @Pyonsuke 2 місяці тому

    楽しみながら勉強になるという一石二鳥な動画

  • @LNTakeshi
    @LNTakeshi 3 місяці тому +1

    分散DB(や辛いシャーディングDB)の場合は大丈夫なのか???と斜に構えて見てしまいましたが、きちんとホットスポットについても触れられていたことが良かったです。
    TiDBでUUIDv4やめるみたいな過ちが生まれる懸念が動画タイトルだけではありましたが、問題なさそうで安心しました。
    作るサービスの規模感や読み書きの特性を元に適切なIDの決め方が出来ると良いなあと思いました。ありがとうございました。

  • @h1day
    @h1day 3 місяці тому +6

    スライドが見やすくて綺麗すぎる!

  • @fomofom
    @fomofom 2 місяці тому

    面白かったです

  • @wataru-desu
    @wataru-desu 2 місяці тому

    DBについてよく分からないけど、どこかにデータが保存されてみたいな感じで苦手意識が強かったのですが、裏側ではただのファイルだという事が驚きでした。(よくよく考えれば当たり前ですが)少し苦手意識がなくなりました。とても良い動画ありがとうございます。解説で使用されていたベンチマークの表ってどのように作成されているのでしょうか。
    ベンチマークの測り方とか提案の仕方ついて詳しくなりたくてご教授頂けると嬉しいです!
    Web開発におけるパフォーマンス改善で良く遭遇するベンチマークの観点等とかありましたら知りたいです。
    よろしくお願いします。

  • @p000m
    @p000m 3 місяці тому

    22:52 UUIDv4だとランダムだからindeのたびにページ分割がはしるけど、UUIDv7やULIDのように「(日時)+(ランダムビット)」と順番になるデータならindex作成時にページ分割なく追加できるから願ったり叶ったり…?なのか…?あってる…?

  • @shoyam4284
    @shoyam4284 3 місяці тому

    DBについて弱い自分にはめっちゃ勉強になりました。恥ずかしながらUUIDにVerがあることも知らなかったです。

  • @kumasan1969
    @kumasan1969 3 місяці тому +1

    メインフレーム用のDBの場合、ファイルではなく専用のファイルシステムでデータを管理している場合がある。いやあったけれども今はどうかわからない。SQL でなくて Postquel を使ってた頃の Postgres は確かそういう選択肢があったかも。うろ覚え。
    B+Tree は、30年前、大学のData Structureのクラスの課題で実装させられた。懐かしい…

  • @null776
    @null776 3 місяці тому +1

    非常に面白かったです。

  • @yas-156
    @yas-156 3 місяці тому +14

    ちょっと突っ込ませてもらうと、コミットでトランザクションログに書き込むの理由はパフォーマンスです。動画ではトランザクションログをオフにすると書き込みが速くなると言っていますが、一般論としては逆でコミットが遅くなります。トランザクションログに書く方がトランザクションでの更新データをまとめて書き込むのでI/O数は少なくなるからです。

    • @moozaru
      @moozaru  3 місяці тому +1

      ツッコミありがとうございます!
      トランザクションログへの書き出しと、データファイルへの書き出しは書き込み方が異なるので、トランザクションログの方が高速なのはおっしゃる通りです。トランザクションログは追記するだけなのでディスクI/O少なくなるはず。
      動画でパフォーマンスに言及したのは、ちょっと特殊なケースで、トランザクションログをオフにしてバッファに乗るだけのデータ量のとき実質メモリテーブルになり高速化する・あるいは大量データを初期ロードする時に一時的にオフにすると速度を稼げるという意図を伝えたかったつもりでした。伝わりにくい表現ですいません!

    • @yas-156
      @yas-156 3 місяці тому

      @@moozaru 初期ロードの場合はそうですね。ありがとうございます。

    • @mm839
      @mm839 3 місяці тому

      @@moozaru
      横からすみません。結論以下の認識であっていますか?
      トランザクションログを使うと一般的には処理が速くなるけど、特定の条件下ではオフにした方が速いこともあるよ

    • @moozaru
      @moozaru  3 місяці тому +3

      @@mm839 色んな要素があるので一言で表現しにくいのですが、なるべくシンプルに表現すると以下です(ぼくの認識なので間違っていたら申し訳ない)
      - トランザクションログとデータファイルへの書き出しでは、トランザクションログの方が高速
      - トランザクションログは単純に追記するだけだが、データファイルはページ内の並びがあるため分割が発生する(ここはPostgreSQLとMySQLなどDBで書き込み方は違います)
      - トランザクションログへの書き出しは原則コミットごとだが、データファイルへの書き出しはなるべく溜めてから書き出す
      - これはデータファイルへの書き出しコストが高いのでDiskI/Oをなるべく抑えるための工夫(非同期化とも言える)
      - トランザクションログの本来の役割はデータの永続性だが、上記の特性から間接的に処理が高速になっている部分がある
      - ただし、トランザクションログをオフにして明確に早くなるのはメモリバッファにすべてのデータが乗る・大量データを初期ドーロする際に余計な処理をスキップできるといった状況です
      - いずれにしてもトランザクションログをオフにするケースはかなり限定的です
      シンプルにしようと思ったのですが…ややこしい表現になってしまった…。

    • @yas-156
      @yas-156 3 місяці тому +1

      @@mm839 通常運用下でトランザクションログをオフにすることはほぼ100%ありえませんね。

  • @とな-c1q
    @とな-c1q 3 місяці тому

    すごくおもしろかったです!
    勉強しなきゃと思いつつも後回しになってたDBについて知見をわけていただけて本当に感謝

  • @MiyakawaTakeshi
    @MiyakawaTakeshi 3 місяці тому +15

    データベースをめぐる問題は複雑な上に、現実世界では、それなりの規模のシステムを支えているデータベースのスキーマ変更は影響範囲の調査だけでもコストがかかりすぎて、なかなか着手できないことが多い、と感じます。
    しからば、本番運用前にしっかり設計できるのか? 本番運用前にリアルなテストデータを入れてベンチマークできるのか? というと、これもカンタンではない。
    本番運用開始後に漸進的な改善することが困難であり、かつ、本番運用開始前に徹底的に設計することも難しい。
    僕はより深刻な問題は、前者、漸進的な改善が難しい、という点にあると思う。後者、本番運用開始前の設計は、そのシステムの重要性が明らかであるなら、優れたエンジニアを借りてくれば、相当程度実施できる。そのシステムへの投資価値が不明ならスモールスタートするしかないので、ますます「漸進的な改善」が重要になるのに、それが難しいというのが問題なんだよな、と感じる。
    あるデータベースにアクセスしているプログラムをすべてマイクロサービス的なAPIサーバ経由に限定することが、まずまずの改善策ですかね...

    • @moozaru
      @moozaru  3 місяці тому +3

      非常に刺激的な視点ですね。たしかにデータベースが一番変更しにくい箇所のわりに、データベース設計次第で開発するシステムの品質が決まるくらいに影響は大きいんですよね…。
      漸進的な改善をDB観点で行おうとすると、どうしても小さいサービスに分割するマイクロサービス路線になっていくというのも分かるかもしれません。ただ、マイクロサービスはマイクロサービスで分割の仕方が難しくて悩ましさはつきませんね…

    • @MiyakawaTakeshi
      @MiyakawaTakeshi 3 місяці тому

      @@moozaru マイクロサービスを導入した後、分割の粒度や、分割の境界線のミスをしたとき、どうやって改善するのか、改善する計画の価値(コストパフォーマンス)をどう評価するのか、というのは、悩ましい...というか、正直サッパリわからん、というのが本音ですね。しかし、おそらく、いくつかの抽象層を重ねることが正解、だと予想しています。

  • @爪切って手で取ろうとすると皮

    20:07
    ここらへんのプライマリキーの値順にレコード単位がpageに格納されているの文脈でいう、”値順”というのは、
    プライマリキーが文字型だと、そのDBのエンコード形式に依存するのですか

  • @mitsutakawatanabe779
    @mitsutakawatanabe779 3 місяці тому

    とてもわかりやすいです。

  • @londelidess
    @londelidess 3 місяці тому +2

    こういう話題が1番おもしろいわ

  • @DaishiArakawa
    @DaishiArakawa 3 місяці тому

    最高でしたー、深掘りありがたい😂
    お疲れ様です♪

  • @3o1415926535
    @3o1415926535 2 місяці тому

    分析用に大量データをDBにロードする時とかはログ書き込みはオフりますね もう目に見えて速くなります
    あとfluent-bitのログ位置の保存(SQLite)など内在的にチェックポイントを抱えているソフトウェアをうごかすと何度もfsyncしてくれるのでDisk IOが跳ね上がってイライラします
    もうサーバのない世界に生まれたい

  • @ythi8546
    @ythi8546 3 місяці тому +1

    LinuxだとUUIDを大量に採番するとエントロピープールが枯渇して遅くなるから代わりに/dev/urandom を使った方がいいけど、ランダムさが下がるから微妙。みたいな話を昔聞いたことがあるんですが、DBで採番する時はその辺気にならないんでしょうか?

  • @yas-156
    @yas-156 3 місяці тому +4

    昔のDBエンジニア(現役から外れて大分経ちます)なんで最近の技術には疎いのですが、UUIDを主キーにする理由がよくわかりません。特にデータモデルでUUIDという内部的なコードを意識するイメージが湧きません。どんな時に使ってるのでしょうか?

    • @yukiy1339
      @yukiy1339 3 місяці тому +2

      私が見かけたケースですと、idがURLの一部に含まれてしまうようなフレームワークでオープンなWebサービスの時に、UUIDを使っているPJがありました。
      一定数はスクレイピングやデータがどれくらいあるか把握しにくくするために、UUIDを選択した過去があるとのことでした。

    • @kaz-jn7ro
      @kaz-jn7ro 3 місяці тому

      連番idの欠点(操作が冪等でない、分散DBではid発番のための同期がボトルネックになる)が問題になる場合ですかね

    • @moozaru
      @moozaru  3 місяці тому +7

      UUIDを主キーにしたいモチベーション以下のようなものをよく聞きますね
      ・利用度を外から観測できる連番を使いたくない
      ・DBで採番するコストを避けてクライアント側でID発行したい

    • @naokitakeshita5494
      @naokitakeshita5494 3 місяці тому +2

      セキュリティ的にもUUIDが優位かなと。マルチテナントのシステムだと特に。

    • @yas-156
      @yas-156 3 місяці тому +1

      皆さん、返信ありがとうございます。
      質問しておいてなんですが、多分Webシステムがらみだろうなとは予想していました。
      ただ感覚的には、一時的なキーであれ外部には晒したくないなと思ったり、ユニークキーとして使うにはオーバースペックかなと思ったり。
      今現役で設計するならどんな風にするだろう?

  • @しーちゃんねる-b8n
    @しーちゃんねる-b8n 3 місяці тому +2

    有料級ですね!

  • @user-ah0
    @user-ah0 2 місяці тому

    結論: 遅いけどクソどうでもいい差なので無視してOKということね。

  • @makuradohizato
    @makuradohizato 3 місяці тому

    PostgreSQLだとhash indexとかもあってUUID v4でもあんまりパフォーマンスは落ちづらいですね

    • @makuradohizato
      @makuradohizato 3 місяці тому

      ​@@KennEjima HDDの話ですよね?SSDだとランダムアクセスが十分早いので、ベンチマーク上でもhashの方がB+木よりも早くなることが多いみたいです

    • @KennEjima
      @KennEjima 3 місяці тому

      ​@@makuradohizato 主キーだけO(1)で引いてくる場合はそうですが、実用的な場面ではセカンダリインデックス(たとえばcreated_atなど)で範囲検索やORDER BYをかけるなど、結局B木のlocalityが必要になることがほとんどなので、hashだけで完結できる用途はほとんどないというのが実際のところだと思います。
      日付などでソートしながらhashから引いてくるとバッファキャッシュのthrashingが起きるので(ランダム性=局所性の意図的な破壊、なので当然ですが)、極めて遅くなります。
      動画でも説明あったように、DBのメモリとディスクのマップは16KBなどのページ単位で行われるので、ランダムアクセスといっても狙ったレコードを1件だけ取り出すようなわけにはいかず、1件ごとに16KB単位でドカッと読み込んでくることになります。そして、たまたま欲しいレコードが同じページに存在する確率を意図的にゼロに近づけるアルゴリズムがランダム化でありhashです。なんならSSDの寿命も縮めかねませんね。

  • @ニッケ-i3j
    @ニッケ-i3j 3 місяці тому +2

    一つのことをこんなに深掘りするエンジニアが必要な事業ってものすごい金が動いているのかな。
    某企業でアプリ開発、WEB開発、インフラ、DB、マーケティングとかぜんぶアホ面で一人でやってるけど
    DBのチューニングなんて鼻くそほじりながらカーディナリティ高い順にインデックス張るくらいのことしかしてないわ

  • @mogumogu365
    @mogumogu365 3 місяці тому

    面白かったです!また、勉強になりました。
    B2Bのマルチプロダクト体制のデータベースは別々になるので、DBをまたいでもユニークなUUIDを使いたいですね。最近は時系列に並べられつつランダムなULIDもでてて、今はそれを使ってます。
    ただ、そのパフォーマンスは見たことがないので、続編にULIDとULIDの比較があると嬉しいです!!

  • @favoriteu2
    @favoriteu2 3 місяці тому

    UUIDv7出たのは初めて知りました!みんな自家製で作っていると思い込んでいました。

  • @ほむほむ-m9t
    @ほむほむ-m9t 3 місяці тому

    楽しそうなチャンネル発見

  • @たぬきという名のパンダ
    @たぬきという名のパンダ 3 місяці тому +1

    NoSQLだとどうなんやろ?

    • @たぬきという名のパンダ
      @たぬきという名のパンダ 3 місяці тому +1

      最後まで見たら、nosqlだと問題なさそうなことがわかった

    • @MiyakawaTakeshi
      @MiyakawaTakeshi 2 місяці тому

      NoSQLではむしろ積極的にUUIDを主キーに使うケースが多いと思います。
      スケールアウトさせやすいですからね。

  • @cloghjordan
    @cloghjordan 2 місяці тому

    しばらくぶりだなぁ