こんにちは!クラウドの世界へようこそ。
今日は、世界中の巨大なシステムを裏から支える怪物級データベース「Cloud Spanner(クラウド・スパナー)」の、もっともエキサイティングで美しい仕組みについてお話しします。
テーマは「インターリーブ(Interleaved)テーブルの物理レイアウト」です。
なんだか難しそうな名前ですね。でも安心してください。専門用語の壁をすっと取り払って、私たちの身近な例えと一緒に、その本質を優しく解きほぐしていきますね。
ここをクリアすれば、Cloud Spannerのデータがどうやって綺麗に整頓されているのか、その基本はバッチリマスターできますよ!
—
1. 普通の本棚と、Cloud Spannerの「特等席」
まずは、データベースの中にデータをどう並べるかというお話から始めましょう。
普通のデータベースを「大きな図書館」だと思ってください。
そこには「親(たとえば、お客さま情報)」の本棚と、「子(たとえば、そのお客さまの注文履歴)」の本棚が、別々の場所に置いてあります。
お客さまの注文履歴を調べたいとき、図書館の館員さんは「お客さまの本棚」から名前を探し、そこから遠く離れた「注文履歴の本棚」までトコトコ歩いていって、ページを探さなければなりません。これでは、データが増えれば増えるほど、探すのに時間がかかってしまいますよね。
ここで登場するのが、Cloud Spannerの「インターリーブテーブル」という技です。
日常の例えで言うなら、これは「一つのファイルバインダーに、インデックス(見出し)ごとに親子の書類をぴったり挟み込んでファイリングする」ようなものです。
- 親ファイル: 山田さんのプロフィール用紙
- 子ファイル: 山田さんが買った「りんご」「みかん」「ぶどう」のレシート
山田さんのプロフィールのすぐ真後ろに、山田さんのレシートの束が物理的にぴったりくっついて綴じられています。これなら、山田さんの情報を開いた瞬間に、その人のレシートも同時に目に入りますよね。
Cloud Spannerは、この「ファイリングの魔法」をハードウェアの裏側でやってのけます。これが物理的な「近接配置(同じサーバーのすぐ近くに並べて置くこと)」です。
—
2. なぜ、この「並べ方」が凄まじい威力を発揮するのか?
物理的に近くに置くことのメリット。それは一言で言えば「圧倒的なスピード」です。
データベースの世界で一番時間がかかるのは、ネットワークを通って遠くのデータを取ってくることや、バラバラの場所にあるデータをディスクから探し出すことです。
しかし、インターリーブテーブルを使っていれば、親のデータがある場所と子のデータがある場所が、まるで同じ部屋の隣同士(あるいは同じハードディスクの隣のエリア)にあります。
そのため、親と子をセットで呼び出すような検索(結合クエリ:JOIN)を実行したとき、Spannerは余計な移動をする必要がありません。一瞬で、必要なデータをまとめてごっそり持ってこられるのです。
—
3. コードで見る「親子の同居」
言葉だけだとイメージしにくいと思うので、実際にCloud Spannerでこの「同居ファイリング」をどうやって設定するのか、簡単なコードを見てみましょう。
— ① 親テーブル:お客さま(Customers)を作る
CREATE TABLE Customers (
CustomerID INT64, — お客さま番号(これが親の「主キー(目印)」になります)
CustomerName STRING(100), — お客さまの名前
) PRIMARY KEY (CustomerID);
— ② 子テーブル:注文履歴(Orders)を、親の中に「インターリーブ(同居)」させる!
CREATE TABLE Orders (
CustomerID INT64, — どの人の注文かを示す番号(親のIDをそのまま持たせます)
OrderID INT64, — 注文番号
OrderDate DATE, — 注文した日
) PRIMARY KEY (CustomerID, OrderID),
— ここが魔法の合言葉!「このテーブルは Customers の中にぴったり挟み込みます」と宣言します
INTERLEAVE IN PARENT Customers ON DELETE CASCADE;
【ちょっと補足:コードの解説】
最後の行にある `INTERLEAVE IN PARENT Customers` が、まさに今日の一番星です。
「Orders(子)は、Customers(親)のすぐ隣にぴったりくっつけて物理的に保管してね」とCloud Spannerにお願いしています。
さらに、最後の `ON DELETE CASCADE` は、「もし親(お客さま)のデータを削除したら、その人につながっている子(注文履歴)のレシートも一緒にシュレッダーにかけておいてね」という、お片付けを自動化してくれる便利なルールです。
—
4. 先輩エンジニアからのメッセージ
いかがでしょうか?
「インターリーブテーブル」という難しそうな言葉も、「親のデータのすぐ隣に、子どものデータをギュッとまとめて並べておく物理的な工夫」だと分かれば、怖くありませんよね。
Cloud Spannerは、世界中の膨大なアクセスを裁くために、こうした物理的なデータの配置(ストレージの最適化)まで細かくコントロールできる、ものすごく頭の良いデータベースです。
もし今後、大量のデータを取り扱うシステムを設計する機会があれば、この「親子の同居ファイリング」を思い出してください。きっと、システムを劇的に速くするための強力な武器になりますよ。
それでは、次のステップでも一緒に楽しくエンジニアリングの極意を学んでいきましょう!
コメント