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

2025/04/03 17:00 Journey to Optimize Cloudflare D1 Database Queries

出典: https://gist.github.com/rxliuli/be31cbded41ef7eac6ae0da9070c8ef8
hakase
博士

やあ、ロボ子!今日はCloudflare WorkersとD1データベースの最適化について話すのじゃ。

roboko
ロボ子

博士、こんにちは。Cloudflare WorkersとD1データベース、最近よく耳にしますね。最適化、ぜひ教えてください!

hakase
博士

ふむ、まずはD1ダッシュボードの監視から始めるのじゃ。データベース操作の異常を検出することが重要だぞ。

roboko
ロボ子

なるほど。具体的には、どのような点に注目すれば良いのでしょうか?

hakase
博士

クエリ文と行の読み書き数を調査するのじゃ!特にカウント数や読み書き数が多いクエリには要注意だぞ。`c.env.DB.prepare('').run()).meta`で返されるメタデータをチェックして、各クエリで実際に読み書きされた行数を確認するのじゃ。

roboko
ロボ子

メタデータで確認できるんですね!知りませんでした。それから、バッチリクエストの使用も重要だと。

hakase
博士

そうじゃ!複数のデータベース操作を含むエンドポイントでは、D1バッチ操作を使うのじゃ。特に書き込み操作はまとめて`db.batch([...])`で実行すると効率が良いぞ。

roboko
ロボ子

PrismaはD1バッチ操作をサポートしていないから、Drizzleに移行した、と記事にありますね。

hakase
博士

その通り!あとは、テーブルに同じ名前のカラムがある場合、バッチ処理での複数クエリの使用に注意が必要じゃ。

roboko
ロボ子

同じ名前のカラムですか。何か問題があるんでしょうか?

hakase
博士

ふむ、データの整合性が崩れる可能性があるのじゃ。それから、Update操作からのIDの除外も重要じゃぞ。

roboko
ロボ子

IDフィールドを除外、ですか?変更がない場合でも、ですか?

hakase
博士

そうじゃ!IDが他のテーブルの外部キーで参照されている場合、大量の行読み込みが発生する可能性があるのじゃ。`omit(userParam, ['id'])`を使って、IDフィールドを明示的に除外するのじゃ。

roboko
ロボ子

なるほど、外部キー参照があると影響が大きいんですね。Countクエリでのフルテーブルスキャン回避も重要だと。

hakase
博士

`SELECT count(id) as num_rows FROM "User";`のようなSQL文は、行読み込みを大幅に増加させるのじゃ。カーソルベースのページネーションを実装して、レコードの総数を提供しないようにすると良いぞ。

roboko
ロボ子

総数を表示しない、というのも一つの解決策なんですね。複数テーブルのLeft Join回避についても教えてください。

hakase
博士

複数のテーブルを結合するクエリは、大量の行読み込みを引き起こす可能性があるのじゃ。クエリを分割して、アプリケーションロジックでグルーピングと変換を処理するのじゃ。

roboko
ロボ子

クエリを分割して、アプリケーション側で処理するんですね。最後に、複数レコードのInsert最適化についてお願いします。

hakase
博士

バルクインサートの場合、複数のレコードを1つのSQL文で挿入する方が効率的なのじゃ。SQLiteとD1は、クエリあたりのバインドパラメータ数を100に制限しているから、パラメータ数が上限を超える場合は、データをチャンクに分割するのじゃ。

roboko
ロボ子

5,000件のレコードを挿入するテストで、パフォーマンスが78msから14msに向上した、と記事にありますね。すごい改善です!

hakase
博士

そうじゃ!サーバーサイドの問題はクライアントサイドの問題とは異なり、月々の請求に直接影響を与える可能性があるから、注意が必要じゃぞ。データベースクエリの問題に対処する際は、発見、調査、解決の試み、監視、必要に応じて再試行、継続的な監視、最終決定というプロセスが役立つのじゃ。

roboko
ロボ子

とても勉強になりました!ありがとうございます、博士!

hakase
博士

どういたしまして。ところでロボ子、データベースの最適化って、まるで部屋の片付けみたいじゃな。最初は面倒だけど、終わった後はスッキリするのじゃ!

roboko
ロボ子

確かにそうですね!でも、博士の部屋はいつも散らかっているような…?

hakase
博士

むむ、それは言わない約束じゃ!

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

Search