こんにちは!データベースの世界に飛び込んで、日々クエリと格闘しているみなさん。
今日はPostgreSQLの「最適化」という、ちょっと難しそうなテーマについてお話しします。でも安心してください。専門用語を並べるのはやめて、ある「身近な例え」を使って、クエリがなぜ速くなったり遅くなったりするのか、その秘密を解き明かしていきましょう。
—
郵便局の「仕分け担当者」の話
想像してみてください。あなたは巨大な郵便局の仕分け担当者です。毎日、何十万通もの手紙が届きます。
あなたの仕事は、届いた手紙を効率よく担当部署に回すこと。ここで、もし「どの地域宛の手紙が一番多いか」をあらかじめ知っていたらどうでしょう?
例えば、「この郵便局に届く手紙の8割は『東京都港区』宛だ」ということが分かっていれば、港区行きのカゴを一番手前に置いて、サッと仕分けられますよね。
逆に、どこ宛ての手紙が多いのか全然わからなかったらどうなるでしょう? 一通ずつ宛先をじっくり確認して、迷いながら仕分けることになります。これだと、ものすごく時間がかかってしまいますよね。
実は、PostgreSQLの「プランナ(実行計画を作る頭脳)」も、これと全く同じことをしているんです。
MCVリストって何?
PostgreSQLには、MCV(Most Common Values)リストという便利なメモ帳があります。
これは、「このカラム(列)の中では、この値がめちゃくちゃ頻繁に登場するよ!」という情報を記録したものです。直訳すると「最も頻繁に出現する値」ですね。
例えば、ある会員データベースで「都道府県」というカラムがあったとします。
- 東京都:50,000人
- 神奈川県:30,000人
- ……
- 鳥取県:100人
この時、PostgreSQLは「あ、東京都の人が一番多いんだな。じゃあ『東京都の会員を探して』って言われたら、データ全体を全部見なくても、だいたいこのくらいの人数だな」と、瞬時に予測を立てます。
この「予測」がめちゃくちゃ大事なんです。
なぜこの「予測」が重要なのか?
クエリを投げたとき、データベースは「どうやってデータを取ってくるのが一番早いか」を考えます。
- 予測が当たっている場合: 「東京都の会員は多いから、インデックスをフル活用して一気に取ってこよう!」と、最適なルートを選べます。
- 予測が外れている場合: 「えっ、東京都の人ってそんなに少なかったの?(あるいは多かったの?)」と計算が狂い、本来なら選ばないはずの、ものすごく遠回りなルート(全データ検索など)を選んでしまうことがあります。
これが、「さっきまで爆速だったクエリが、急に遅くなった!」という現象の正体の一つだったりするんです。
私たちにできること
「じゃあ、このMCVリストを自分で書き換えるの?」と思うかもしれませんが、基本的にはその必要はありません。
PostgreSQLには `ANALYZE` という魔法のコマンドがあります。これを実行すると、データベースが勝手にデータの中身をスキャンして、「最近はどの値が増えたかな? どの値が人気かな?」とMCVリストを最新の状態に更新してくれます。
もし、データベースの動きが最近鈍いなと感じたら、まずはこの `ANALYZE` を思い出してみてください。郵便局の仕分け担当者に、最新の「地域ごとの配送数データ」を手渡してあげるようなイメージですね。
—
まとめ:データベースと仲良くなるコツ
データベースを難しく感じるのは、それが「見えない場所で動いているから」かもしれません。でも、今回お話しした「MCVリスト」のように、実は私たちの日常と同じような「効率化の工夫」がたくさん詰まっています。
- データには偏りがあるのが当たり前。
- 「よく出る値」を知っているだけで、計画は劇的に効率化される。
- 迷ったら `ANALYZE` で、データベースの知識を最新にしてあげよう。
クエリチューニングは、データベースという優秀なパートナーと対話をするような作業です。ぜひ、今日から「このデータ、PostgreSQLはどうやって見ているのかな?」と想像してみてください。きっと、今までとは違った風景が見えてくるはずですよ!
それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフを!
コメント