データベースインデックスの魔法
5分59秒 | DB基礎FE
基本情報技術者試験の頻出テーマを解説した動画コンテンツです。
トランスクリプト(字幕テキスト)
さぁ今回はですね、データベースの検索をもう稲妻みたいに速くしちゃう、そのシンプルな魔法の裏側を一緒に見ていきましょうか。 さて、まず最初にデータベースがもう毎日毎日直面している、とてつもなく大きな問題から話を始めたいと思います。 いいですか、ここに100万件ものデータが入ったデータベースがあるとします。で、あなたの仕事はその中からたった一つ、たった一つのデータを見つけ出すこと。どうします? この問題、ちょっと身近なものに置き換えて考えてみましょうか。例えば、そうですね、 1000ページもある分厚い技術マニュアル。その中からたった一つの専門用語を探し出すとしたらどうします? まあやり方は2つありますよね。1つは力技。1ページ目から1000ページ目までひたすら虱潰しに読んでいく。 データベースの世界で言ういわゆる「フルスキャン」ってやつです。もう一つは、そう、みんなが知ってる近道を使う方法です。 もう想像つきますよね。フルスキャンなんてやってたら日が暮れちゃいますよ。たった一つの単語を見つけるために本を丸ごと一冊読むようなものですから。 これじゃどんなアプリケーションも使い物になりませんよね。致命的です。 そこで登場するのがさっき言った近道。そう、インデックスです。これがね、本当にエレガントな解決策なんですよ。どういうことか見ていきましょう。 データベースインデックスっていうのは、要するに本の巻末にある索引と全く同じものです。データ本体とは別に用意された、いわばカンニングペーパーとか早見表みたいなものなんですよ。 だからここがめちゃくちゃ重要なんですけど、このカンニングペーパーがあればデータベースはもういちいち全ページを読まなくていいんです。 パッと見て目的のデータがどこにあるかを確認して、そこに直接ジャンプできる。たとえレコードが何百万件あろうと、ほぼ一瞬で見つけ出せるってわけです。 いやでも待てよと。その魔法みたいなカンニングペーパー、一体全体どういう仕組みでそんなに速いんだって思いまよね。その心臓部を覗いてみましょうか。 ほとんどのデータベースで使われているのが、このBツリー(B-Tree)。Bツリーっていうデータ構造なんです。 まあデータをピラミッドみたいに、あるいは逆さまにした木のような形で、すごく効率よく整理してくれる仕組みだと思ってください。 で、このBツリーの検索がまたすごいんですよ。まず一番上のルートからスタートしますよね。 で、そこから左に行くか右に行くか、っていうすごくシンプルな選択を繰り返していくだけなんです。1段階下に降りるたびに探すべきデータの範囲がもう劇的にごそっと減っていく。 そしてわずか数ステップ、本当に数回ですよ。たったそれだけで何百万件の中から目的のデータがどこにあるかピンポイントで見つけちゃうんです。いやこれ考えた人天才ですよね。 ここまで聞くと、え、インデックス最強じゃん。じゃあもう全部のデータにインデックスつけちゃえばいいんじゃないのって思いますよね。僕も最初そう思いました。 でもね、やっぱりそんなうまい話ばかりじゃないんですよ。インデックスには無視できない2つの大きなコスト、まあデメリットがあるんです。 まず1つ目。データの更新が遅くなる。どういうことかというと、新しいデータを追加したり、既存のデータを変更したりするたびに、 本体だけじゃなくてこのインデックスっていうカンニングペーパーも書き直さなきゃいけないんですよ。これが地味に時間がかかる。 そして2つ目、ストレージを余分に食う。当たり前ですけどインデックス自体もデータですからね。ディスクの容量をその分余計に使ってしまうんです。 この表がそのトレードオフをすごくわかりやすく示してますよね。インデックスがあると検索、つまりセレクトはもうロケットみたいに爆速になります。 でもその代わりデータの追加や更新、インサートとかアップデートは亀さんみたいにちょっと遅くなる。そしてストレージ容量も余分に必要になる。 つまりスピードをとるか、それとも更新の速さや容量の節約をとるか、という選択になるわけです。 そしてまさにこのトレードオフをちゃんと理解して、賢く使いこなせるかどうか。ここがデータベース設計の初心者とプロを分ける大きな違いなんですよ。 プロはこう考えるんです。とりあえず追加するのはアマチュアのやること。必要なところに選択的に追加するのがプロなんだと。 闇雲にインデックスを貼るんじゃなくて、どこに貼れば一番効果的かをちゃんと考えるわけです。 じゃあ、そのどこに貼るかをどうやって決めるのか。そこでプロが使う判断基準がこの「カーディナリティ」という言葉です。 ちょっと難しそうに聞こえますけど、要はその列にどれだけユニークな、つまり種類の違う値が入っているかっていうただそれだけのことです。 ユーザーIDとかメールアドレスみたいに値がほとんど全部違うユニークなもの。こういうのを高カーディナリティって言います。こういう列にインデックスを貼ると一気にデータを絞り込めるからめちゃくちゃ効果的。 逆に、性別とか国コードみたいに値の種類が少ないもの。これは低カーディナリティですね。 ここにインデックスを貼っても正直あまりデータを絞り込めないから効果は薄いわけです。 さあ、これでインデックスの秘密、その強力な考え方がわかりましたよね。闇雲に貼るんじゃなくて、カーディナリティを意識する。この基本原則がわかればもう大丈夫です。 では、この知識を使ってあなたのプロジェクトで最初にインデックスをつけるべきカラムはどこになるでしょうか。ぜひ考えてみてください。
このコンテンツは Web society で視聴・学習できます。