なぜデータベースは「いつものあれ」をすぐに見つけられるのか? —— MCVの秘密
こんにちは!データベースの世界にどっぷり浸かって早数年、皆さんの「データベース、ちょっと難しいな……」を「なるほど、そういうことか!」に変えるお手伝いをしているエンジニアです。
今日は、PostgreSQLが裏側でこっそりやっている「MCV(Most Common Values)」という、ちょっと賢い仕組みについてお話しします。
といっても、難しい数式は一切なし。まずは、ある「カフェ」を想像してみてください。
カフェで注文する「いつもの」あれ
例えば、あなたがよく行くカフェに、とびきり注文の多い「看板メニュー」があるとします。
カフェの店員さんは、あなたが店に入ってきた瞬間、まだ注文を聞く前でも「あ、またあの『アイスコーヒー』ですね?」とピンとくるかもしれませんよね。
これって、店員さんが「この店ではアイスコーヒーが一番よく出る」という統計情報(経験則)を頭に入れているからできることなんです。
もし、店員さんが何も知らなくて、メニューを最初から最後まで全部読み上げていたらどうでしょう?
「えーと、ブレンドコーヒー、紅茶、カフェラテ……あ、ありました、アイスコーヒーですね」と、毎回確認していたら、コーヒーが出てくるまでにすごく時間がかかってしまいますよね。
データベースにとっての「MCV」=「超・売れ筋リスト」
実は、PostgreSQLもこれと全く同じことをやっています。
データベースの中には、何百万、何千万という膨大なデータが入っています。その中で「ある特定の条件に合うデータを探して!」と命令されたとき、PostgreSQLは「どこから探せば早いかな?」と、作戦会議(クエリプランニング)を開くんです。
そのとき、PostgreSQLがカンニングペーパーとして使っているのが「MCV(Most Common Values)」、つまり「よく登場する値のランキングリスト」です。
- 「この列には『東京都』のデータがすごく多いな」
- 「この列は『完了』というステータスがほとんどだな」
PostgreSQLは、このように「頻繁に出てくる値」をリストアップして覚えています。だから、あなたが「東京都のユーザーだけ見せて!」と検索したとき、「はいはい、いつものやつですね!」と、迷わず最短ルートでデータを取りに行けるんです。
なぜこれが重要なのか?
もしMCVがなかったら、データベースは毎回「全件調べてみないと、どれくらいデータがあるかわからないぞ……」と、とりあえず全部の棚をひっくり返すような大仕事をしてしまいます。
結果として、
- 検索がものすごく遅くなる
- サーバーが頑張りすぎて、PCが熱くなる(リソースの無駄遣い!)
という悲しい事態になりかねません。
MCVがあるおかげで、PostgreSQLは「検索結果がどれくらいの量になるか」を事前に予測し、一番効率のいい方法(インデックスを使うのか、全部読み込むのかなど)を瞬時に選ぶことができるんです。
まとめ:データベースと仲良くなるために
私たちが今日覚えておきたいのは、「データベースは、ただデータを貯めているだけの箱じゃない」ということです。
PostgreSQLは、普段からせっせと「何がよく使われているか」を統計としてメモしています。もし皆さんが書いたクエリが急に遅くなったとしたら、それはデータベースがこの「メモ」を更新するタイミングを逃しているのかもしれません。
そんなときは、`ANALYZE`というコマンドを一言唱えてみてください。「最近の売れ筋リストを更新しておいて!」と伝えてあげるだけで、嘘みたいに検索が速くなることがありますよ。
今日のところは、「データベースの中には、よく出る値を覚えている賢いメモ帳があるんだな」と、それだけ覚えて帰ってくださいね!
また次回の記事で、データベースの面白い仕組みについてお話ししましょう。それでは!
コメント