データベース検索を爆速にするインデックスとB木
15分24秒 | DB基礎FE
基本情報技術者試験の頻出テーマを解説した音声コンテンツです。
トランスクリプト(字幕テキスト)
もしあなたが1000ページもある分厚い専門書を渡されて、この中から特定のキーワードが書いてあるページを全部探し出してくださいと言われたらどうしますか? おそらく多くの方が1ページ目から順番にひたすらページをめくっていく、そんな光景を想像するんじゃないでしょうか。 実はこれ、私たちが日常的に触れている膨大なデータの世界で実際に起きていることなんです。フルスキャン、日本語で言うと全表走査ですね。 途方もない時間と労力がかかる、非常に非効率な作業です。でも、本の最後に「あれ」があったら話は別ですよね。 一瞬で目的のページに飛べるあの魔法のページが。今回は、データベースの検索を劇的に速くする「インデックス」という魔法の正体と、その賢い使い方を深掘りしていきましょう。 その本の索引という例えは、インデックスの本質を理解する上でまさに完璧な出発点ですね。今回の分析で目指すのは、表面的な理解に留まることではないんです。 その裏側にある巧妙な仕組みと、必ず付いて回るトレードオフ、つまり何かを得るためには何かを犠牲にするという関係性を深く理解することです。 まさに索引ですね。子供の頃、分厚い百科事典で調べ物をする時に巻末の索引を引いて、「あった!」というあの小さな達成感を思い出します。 あの感覚が、巨大なデータベースの中でも起きているわけですね。インデックスとは、特定のデータと、そのデータが保存されている場所をセットにした早見表のことなんです。 この早見表があるおかげで、データベースは100万件、1000万件のデータを一つずつ確認するという骨の折れる作業から解放されるわけです。 本体のデータがどれだけ増えようと、先にこの整理された早見表を参照するだけで済むから速いと。非常にシンプルで、でも強力なアイデアですね。 ええ。そして、もしこの仕組みを誰かに説明する機会があれば、1ページ目から汗をかきながら本をめくる人と、索引を引いて涼しい顔でページを開く人の比較イラストを載せてみてください。 そのイラスト、目に浮かびますね。全表走査は非効率だと説明するより、1枚の絵の方がインパクトがある。でもここで一つ、疑問が湧いてきます。 本のページが増えて分厚くなると、索引自体も分厚くなりますよね。早見表自体が巨大になったら、そこから目的の項目を探すのも大変になるんじゃないでしょうか。 そこがこの仕組みの巧妙なところなんです。開発者たちが考え出したのが、資料にもあった「B木(B-Tree)」というデータ構造なんです。 B木は、データをピラミッドのような階層構造、つまり「木」の形で管理する方法です。一番上の「根(ルート)」から数回の分岐を辿るだけで、目的の「葉(リーフ)」に辿り着けます。 例えば、高速道路のジャンクションをイメージしてください。標識を見ながら分岐を数回選ぶだけで、迷わず目的地に着けますよね。B木も同じ仕組みです。 「探している値は500より小さいか大きいか」という判断を繰り返し、数回繰り返すだけで、たとえデータが何万件あろうとも、あっという間に目的のデータに辿り着くんです。 なるほど、1ページ目から探す一本道を歩くのではなく、効率的なジャンクションを次々とクリアしていくようなイメージですね。これは賢い。 その通りです。データ量が100万件から1億件に増えても、辿る階層は一段か二段増える程度で済みます。この概念は、実務においても非常に重要な知識です。 これだけ効率的な仕組みなら、全部の列にインデックスを貼っておけば、どんな検索でも爆速になる最強のデータベースが完成するのではないですか? 誰もが一度は通る道ですね。しかし、そこが落とし穴です。その考えは非常に危険なんです。この魔法には、無視できない「代償」が伴います。 代償、ですか。具体的にはどういうことでしょう?大きく分けて二つあります。まず一つ目は、「更新処理の遅延」です。 データの追加、書き換え、削除といった、データを変更する処理が遅くなります。本の例で言えば、1ページ書き換えたら、索引の記述も修正しないといけません。 本文を直して、索引も直してと、作業が二度手間になるわけですね。インデックスが多ければ多いほど、この二度手間の回数が増えていくことになります。 でも、最近はコンピュータの処理能力も高いですし、ミリ秒単位の遅延なら、ビジネスにそこまで致命的な影響はないんじゃないですか? それが、積み重なると大きな影響が出るんです。例えばあるECサイトで、更新が頻繁に発生する列にインデックスを追加しすぎた結果、注文完了までの時間が平均で800ミリ秒も遅くなったケースがあります。 ある調査では、表示速度が1秒遅くなるだけで、顧客満足度は16%低下し、購入に至る割合は7%も低下するというデータがあります。知らぬ間に売り上げを蝕んでしまうのです。 それは怖いですね。技術的な判断が直接ビジネスに跳ね返ってくるわけだ。二つ目のデメリット、記憶容量の消費についても教えてください。 インデックスも「データ」ですから、保存するためのストレージ容量が必要です。インデックスを増やせば増やすほど、消費する容量も当然大きくなります。 バックアップにかかる時間やコスト、ネットワーク負荷など、二次的、三次的な問題を引き起こす原因にもなります。まさにトレードオフですね。 そうなると、どの列にインデックスを貼るべきかの見極めが重要になりますね。「検索は多いけど更新は少ない列」に貼るのがプロの判断基準だと。 ええ。そしてもう一つの重要なキーワードが「カーディナリティ」です。これは、その列に含まれている値の種類がどれだけ多いかを意味します。 例えば「性別」の列は、男性、女性、その他といった数種類しかありません。これをカーディナリティが低いと言います。ここにインデックスを貼っても、あまり絞り込めません。 一方で「会員ID」や「メールアドレス」のように、値がほぼ全部違う列は、カーディナリティが非常に高い状態です。ここならインデックスが真価を発揮し、一撃で検索できます。 なるほど。絞り込み能力が高い列にこそインデックスを貼る価値があると。カーディナリティの低い列に貼って失敗した典型的な例などはありますか? 注文ステータスの4種類しかない列にインデックスを貼ってしまった新人の例がありますね。検索速度の向上はわずかなのに、更新コストだけが積み上がり、パフォーマンスを悪化させてしまいました。 今回の深掘りをまとめると、インデックスは検索を速くする魔法だが、更新の遅延や容量消費というトレードオフがある。だからこそ、カーディナリティを見極めるプロの眼が重要だと。 その通りです。そして、この考え方はエンジニアだけでなく、ウェブサービスやアプリを使うすべての人が知っておいて損はない考え方です。 「なぜこの操作は一瞬なのに、これは待たされるんだろう?」と感じた時、その背景にカーディナリティやインデックス設計のドラマがあるのかもしれない、と想像してみてください。 ただのユーザーとして早い遅いを感じるだけでなく、裏側の設計思想に思いを馳せる。面白い視点ですね。では最後に、一つ問いを投げかけて終わりにしましょう。 Googleのような検索エンジンはどうしているのでしょうか?彼らが相手にしているのは、常に形を変え、増え続ける全世界のウェブページという、構造化されていないカオスな情報です。 彼らはその膨大な情報をどのように索引付けし、私たちがキーワードを入れた瞬間に最適なページを返してくれるのか。少し想像を巡らせてみると、また違った世界が見えてくるかもしれません。
このコンテンツは Web society で視聴・学習できます。