【入門編】 MCVリスト統計 – PostgreSQL

やあ!今日もデータベースと格闘しているかな?

PostgreSQLを触っていると、たまに「なんでこんなにクエリが遅いんだろう?」って頭を抱える瞬間があるよね。実はその原因、データベースが「データの中身を勘違いしている」ことにあるかもしれないんだ。

今日は、そんな勘違いを正して爆速クエリに変えてくれる魔法の杖、「MCVリスト(最頻値リスト)」についてお話しするよ。難しく考えないで、ちょっと日常の風景に例えてみてね。

—

データベースは「適当な予想」で動いている

まず、大前提を知っておこう。PostgreSQLくんは、クエリを実行する前に「この検索にはだいたいこれくらいのデータがヒットするはずだな」って予測を立てるんだ。

例えば、100万件ある「ユーザーリスト」から「東京都の人」を探すとしよう。
もし、データベースが「うーん、日本には47都道府県あるから、東京都の人は全体の1/47くらいかな?」と適当な計算をしたらどうなるだろう?

もし、そのリストの90%が東京都の人だったら?

データベースは「数人しか見つからないはずだ!」と思って最短ルート(インデックス)を使おうとするけれど、実際は大量のデータがあって処理がパンクする……なんて悲劇が起きるわけ。これがいわゆる「見積もりのミス」ってやつだね。

そこで登場!「MCVリスト」というメモ帳

ここで登場するのがMCV(Most Common Values:最頻値リスト)だ。

これは、データベースが裏でこっそり作っている「よくあるデータのメモ帳」のことだよ。

「全データを見て回るのは大変だから、とりあえず『よく出てくる値』をランキングにして覚えておこう!」という仕組みなんだ。これを統計情報として持っておくことで、データベースはこんな風に考えを変える。

  • 昔のデータベース: 「平均すると1/47くらいかな〜(テキトー)」
  • MCVを知ったデータベース: 「お、検索ワードは『東京都』だね。メモ帳を見たら……あ、これ全体の90%を占める超常連さんだ! じゃあ、インデックスを使うより全体をスキャンした方が早いな」

そう、「データに偏りがあること」をあらかじめ知っておけば、賢い判断ができるようになるんだよね。

どうやって活用するの?

実は、PostgreSQLは優秀だから、普段から自動的にこのメモ帳(統計情報)を更新してくれているんだ。でも、データが急激に増えたり変わったりした直後は、このメモ帳が古くなっていて役に立たないことがある。

そんな時は、魔法のコマンドを唱えてあげよう。

ANALYZE テーブル名;

これだけでOK!「おい、もう一回データを確認してメモ帳を書き直してくれ!」とお願いするコマンドだよ。これだけで、クエリの速度が劇的に改善することだって珍しくないんだ。

まとめ:データと仲良くなるために

データベースが遅いとき、それは決して「性能が悪い」わけじゃない。「データの実態を知らないだけ」ということが本当に多いんだ。

  • データには偏りがあるのが普通(人気商品もあれば、滅多に買われない商品もあるよね)
  • 統計情報(メモ帳)は最新の状態にしておく
  • 「見積もりがズレていないか」を疑ってみる

この視点を持つだけで、君ももう立派なデータベースエンジニアの仲間入りだね。

もしクエリが遅くて困ったら、まずは「PostgreSQLくんはちゃんとMCVを活用できているかな?」って、優しく声をかけてあげてみて。きっと、適切な実行計画で応えてくれるはずだよ。

それじゃ、また次回の記事で会おう!Happy Querying!

コメント

タイトルとURLをコピーしました