こんにちは。Cloud Spannerの世界へようこそ。
大規模なシステムを支える心臓部、Spanner。名前を聞くだけで身構えてしまうかもしれませんが、実はその仕組みは非常に理にかなった「整理整頓術」なんです。
今日は、多くのエンジニアが意外と見落としがちな「NULL(ヌル)」とインデックスの不思議な関係についてお話しします。ここを理解すれば、あなたのデータ設計は一段とプロフェッショナルな輝きを放ちますよ。
—
「インデックス」は図書館の目次
まず、インデックス(索引)とは何かをイメージしてみましょう。
大きな図書館を想像してください。本を探すとき、一冊ずつ本棚を見て回るのは大変ですよね。そこで「著者名順」や「タイトル順」の目次があれば、目的の本に一瞬でたどり着けます。これがデータベースにおける「インデックス」です。
では、「もし、その本に『著者名』が書かれていなかったら?」
これが、今回のテーマである「NULL(値がない状態)」の扱いです。
Cloud Spannerのクールな決断
一般的なデータベースでは、「NULL」をどう扱うか迷うことが多いのですが、Cloud Spannerは非常に潔いルールを持っています。
「NULLは、インデックスに含める(記録する)」
これ、実はすごいことなんです。多くのDBでは「NULLのデータはインデックスに載せない」という選択肢をとることが多いのですが、Spannerは違います。NULLであっても、ちゃんと目次の中に「ここはデータが空ですよ」という場所を確保してくれるのです。
なぜNULLを記録するのか?
「データがないのに、なぜわざわざ目次に載せるの? 無駄じゃない?」と思うかもしれません。でも、考えてみてください。
もし、あなたが「まだ未登録のメンバー」を探したいとき、インデックスがNULLを無視していたらどうなるでしょう? システムは全データから「未登録の人」を力技で探し出さなければならず、せっかくのインデックスが役に立ちません。
Spannerは、「NULLも含めてすべての行をインデックスという整列の中に組み込む」ことで、どんな条件での検索でも常にトップスピードを維持しようとするのです。
—
ちょっとコードで見てみましょう
例えば、「ニックネーム」という列にインデックスを張ったテーブルがあるとします。
— ニックネーム列にインデックスを張る
CREATE INDEX UsersByNickname ON Users(Nickname);
この状態で、ニックネームがまだ決まっていない(NULL)ユーザーを検索すると……。
— ニックネームがNULLの人を探す
SELECT FROM Users WHERE Nickname IS NULL;
Spannerは「お任せください!」と言わんばかりに、インデックスを高速に参照して、NULLのユーザーを瞬時に見つけ出します。インデックスの中にNULLがしっかり整列されているからこそできる芸当です。
—
注意点:NULLの扱いで気をつける「たった一つのこと」
一つだけ、先輩としてのアドバイスです。
「NULLが大量にある列にインデックスを張ると、その分だけ目次(インデックス)が少しだけ太る」ということ。
インデックスもメモリやストレージを消費します。もし、検索の条件として「NULLを探すこと」がほとんどないのであれば、インデックスを張る前に「本当にこのインデックスは検索速度向上のために必要か?」を一度立ち止まって考えてみてください。
今日のまとめ
- インデックスはデータを探すための地図。
- Cloud SpannerはNULLを「欠落」ではなく「一つの値」として丁寧にインデックスに記録する。
- だから、NULLの検索も爆速。
ここをクリアしたあなたは、もうSpannerの挙動を根本から理解できていると言っても過言ではありません。データベースがデータをどう整列させているか、その「息づかい」を感じられるようになると、エンジニアとしての視界がぐっと広がりますよ。
もし分からないことがあれば、いつでも聞いてくださいね。一緒に最高にクールなシステムを設計していきましょう!
コメント