やあ!今日もデータベースと格闘しているかな?
PostgreSQLを触っていると、たまに「なんでこんなにクエリが遅いんだろう?」って頭を抱える瞬間があるよね。実はその原因、データベースが「データの中身を勘違いしている」ことにあるかもしれないんだ。
今日は、そんな勘違いを正して爆速クエリに変えてくれる魔法の杖、「MCVリスト(最頻値リスト)」についてお話しするよ。難しく考えないで、ちょっと日常の風景に例えてみてね。
—
データベースは「適当な予想」で動いている
まず、大前提を知っておこう。PostgreSQLくんは、クエリを実行する前に「この検索にはだいたいこれくらいのデータがヒットするはずだな」って予測を立てるんだ。
例えば、100万件ある「ユーザーリスト」から「東京都の人」を探すとしよう。
もし、データベースが「うーん、日本には47都道府県あるから、東京都の人は全体の1/47くらいかな?」と適当な計算をしたらどうなるだろう?
もし、そのリストの90%が東京都の人だったら?
データベースは「数人しか見つからないはずだ!」と思って最短ルート(インデックス)を使おうとするけれど、実際は大量のデータがあって処理がパンクする……なんて悲劇が起きるわけ。これがいわゆる「見積もりのミス」ってやつだね。
そこで登場!「MCVリスト」というメモ帳
ここで登場するのがMCV(Most Common Values:最頻値リスト)だ。
これは、データベースが裏でこっそり作っている「よくあるデータのメモ帳」のことだよ。
「全データを見て回るのは大変だから、とりあえず『よく出てくる値』をランキングにして覚えておこう!」という仕組みなんだ。これを統計情報として持っておくことで、データベースはこんな風に考えを変える。
- 昔のデータベース: 「平均すると1/47くらいかな〜(テキトー)」
- MCVを知ったデータベース: 「お、検索ワードは『東京都』だね。メモ帳を見たら……あ、これ全体の90%を占める超常連さんだ! じゃあ、インデックスを使うより全体をスキャンした方が早いな」
そう、「データに偏りがあること」をあらかじめ知っておけば、賢い判断ができるようになるんだよね。
どうやって活用するの?
実は、PostgreSQLは優秀だから、普段から自動的にこのメモ帳(統計情報)を更新してくれているんだ。でも、データが急激に増えたり変わったりした直後は、このメモ帳が古くなっていて役に立たないことがある。
そんな時は、魔法のコマンドを唱えてあげよう。
ANALYZE テーブル名;
これだけでOK!「おい、もう一回データを確認してメモ帳を書き直してくれ!」とお願いするコマンドだよ。これだけで、クエリの速度が劇的に改善することだって珍しくないんだ。
まとめ:データと仲良くなるために
データベースが遅いとき、それは決して「性能が悪い」わけじゃない。「データの実態を知らないだけ」ということが本当に多いんだ。
- データには偏りがあるのが普通(人気商品もあれば、滅多に買われない商品もあるよね)
- 統計情報(メモ帳)は最新の状態にしておく
- 「見積もりがズレていないか」を疑ってみる
この視点を持つだけで、君ももう立派なデータベースエンジニアの仲間入りだね。
もしクエリが遅くて困ったら、まずは「PostgreSQLくんはちゃんとMCVを活用できているかな?」って、優しく声をかけてあげてみて。きっと、適切な実行計画で応えてくれるはずだよ。
それじゃ、また次回の記事で会おう!Happy Querying!
コメント