Cloudflare D1 に大量のデータを追加してみた
Cloudflare D1
あるシステムにおいて郵便番号から住所を取得する必要があり、 Clouflare Workes と D1 で対応できないかと思い、実際に試してみました。
Cloudflare D1 は、Cloudflare Workers 用に設計されたデータベースであり、SQLite をベースに構築されています。
Twitter 上では過去に D1 へ数千件程度しかデータを登録できなかったとの報告があったので、現在はどうなのか確認します。
(Cloudflare D1 は現在オープンアルファです。)
Cloudflare D1 にデータを登録してみた
基本的な Workers と D1 の使い方は、こちらを参考にしています。
https://developers.cloudflare.com/d1/get-started
郵便番号データは郵便局のサイトから取得しており、 2023/5/31 時点で 124, 574 件あります。
現在 D1 へのデータの複数件登録は、現実的に SQL 文を実行するしかないので wrangler を利用します。
wrangler のバージョンは以下の通りです。
$ wrangler -v ⛅️ wrangler 3.1.1 ------------------
実行するファイルは、単純に INSERT 文が 124,574 行書かれています。
それでは実行してみます。
$ wrangler d1 execute postal_code --file=./sql/20230531_postal_code.sql ▲ [WARNING] Processing wrangler.toml configuration: - D1 Bindings are currently in alpha to allow the API to evolve before general availability. Please report any issues to https://github.com/cloudflare/workers-sdk/issues/new/choose Note: Run this command with the environment variable NO_D1_WARNING=true to hide this message For example: `export NO_D1_WARNING=true && wrangler <YOUR COMMAND HERE>` -------------------- 🚧 D1 is currently in open alpha and is not recommended for production data and traffic 🚧 Please report any bugs to https://github.com/cloudflare/workers-sdk/issues/new/choose 🚧 To request features, visit https://community.cloudflare.com/c/developers/d1 🚧 To give feedback, visit https://discord.gg/cloudflaredev -------------------- 🌀 Mapping SQL input into an array of statements 🌀 Parsing 124574 statements 🌀 We are sending 13 batch(es) to D1 (limited to 10000 statements per batch. Use --batch-size to override.) √ ⚠️ Too much SQL to send at once, this execution will be sent as 13 batches. ℹ️ Each batch is sent individually and may leave your DB in an unexpected state if a later batch fails. ⚠️ Make sure you have a recent backup. Ok to proceed? ... yes 🌀 Let's go 🌀 Executing on postal_code (xxxxxxx-yyyy-yyyy-yyyy-zzzzzzz): INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (6000... 🚣 Executed 10000 commands in 435.0227030199021ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (6831... 🚣 Executed 10000 commands in 338.1931229289621ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (2370... 🚣 Executed 10000 commands in 416.7134309168905ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (3380... 🚣 Executed 10000 commands in 342.95146206766367ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (4410... 🚣 Executed 10000 commands in 339.09952312894166ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (5061... 🚣 Executed 10000 commands in 322.3288749419153ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (6018... 🚣 Executed 10000 commands in 377.30825392343104ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (6561... 🚣 Executed 10000 commands in 328.2806160803884ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (7296... 🚣 Executed 10000 commands in 383.39539610780776ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (8114... 🚣 Executed 10000 commands in 364.8189971335232ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (8940... 🚣 Executed 10000 commands in 344.92221002839506ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (9400... 🚣 Executed 10000 commands in 323.2683620043099ms INSERT INTO postal_code (aaa, bbb, ccc, ddd) VALUES (9820... 🚣 Executed 4574 commands in 166.7635050173849ms
結果、問題なく登録できました。
ログからは1万件毎に分割して実行されていることが判ります。
実際に Cloudflare にアクセスして登録したデータベースを確認すると、行数が 124,574 件あることが判ります。
また workers 経由で問題なく、郵便番号から住所データの取得ができています。
テーブルには郵便番号にインデックスを張っているので、データ検索してもレスポンスが 58 ミリ秒と非常に早いです。
(当初、郵便番号にインデックスを張り忘れており全件検索の状態になっていましたが、そのときは 1.3 秒程度でした。)
結果
当初、Cloudflare D1 に大量のデータを登録できないような情報があったので心配していましたが、オープンアルファのバージョンが上がったためか、現在は正常に登録できました。
正しくインデックスさえ張ってあげれば、 Cloudflare Workes からの検索速度も十分満足な内容です。
今回は Cloudflare D1 の可能性に期待できる結果となりましたので、今後の正式版リリースが楽しみです。