【入門編】 式インデックス(Expression Indexes) – PostgreSQL

こんにちは!データベースの世界へようこそ。

今日は、PostgreSQLのちょっと「裏技」っぽいけれど、実はものすごく頼りになる機能、「式インデックス(Expression Indexes)」についてお話ししたいと思います。

難しい名前ですよね。「インデックス」はなんとなく「本の索引」のことだって聞いたことがあるかもしれません。でも、「式インデックス」って言われると……なんだか急に数学の授業が始まったような気分になりませんか?

大丈夫、安心してください。今日は、この機能を「図書館の探しもの」に例えて、直感的にマスターしちゃいましょう。

—

普通のインデックスは「名前順」のリスト

想像してみてください。あなたは巨大な図書館の司書さんです。棚には数万冊の本が並んでいます。

利用者が「『銀河鉄道の夜』を探してるんだけど」と言ってきたら、あなたはどうしますか?もちろん、本のタイトル順に並んだ「索引カード」を見ますよね。これがデータベースでいう普通のインデックスです。

タイトルが「あ」から始まる本はこっち、「か」から始まる本はあっち、と整理されているおかげで、私たちは一瞬で本を見つけることができます。

「加工したデータ」を探すのは大変!

ところが、ある日こんなお願いをされたらどうでしょう。

「タイトルの『アルファベットを全部小文字にして』検索した時に、一致する本を全部持ってきて!」

さて、困りました。索引カードは「タイトルそのまま」で並んでいるので、大文字と小文字が混ざっていると、うまく探せません。

今のままだと、あなたは全棚を歩き回って、一冊ずつタイトルを小文字に変換しながらチェックするしかありません。これ、めちゃくちゃ時間がかかりますよね。データベースの世界でも、これと同じことが起きています。

そこで登場するのが「式インデックス」

ここで登場するのが「式インデックス」です。これは、「あらかじめ加工した状態の索引カードを作っておく」というテクニックです。

先ほどの例で言うと、図書館のカウンターの横に、もう一つ別の箱を用意するんです。そこには、「タイトルをすべて小文字に変換した状態」で並べ替えた索引カードを入れておきます。

こうしておけば、利用者が「小文字で検索したい!」と言った瞬間、あなたは新しい箱からパッと答えを見つけ出すことができます。

  • 普通のインデックス: タイトル(そのまま)を索引にする
  • 式インデックス: (タイトルを小文字にしたもの)を索引にする

これだけで、検索のスピードが劇的に速くなるんです。

—

実際にPostgreSQLで書いてみよう

PostgreSQLでこれを実現するのは、驚くほど簡単です。例えば、ユーザーの名前を小文字で検索したいなら、こんな風に書きます。

CREATE INDEX idx_lower_user_name ON users (LOWER(name));

たったこれだけ!これだけで、PostgreSQLは「あ、このカラムを小文字にする検索がよく来るんだな」と理解して、裏側でせっせと「小文字変換済みの索引」を管理してくれるようになります。

こんな時に使ってみて!

式インデックスは、次のような場面で魔法のように効いてきます。

  • 大文字・小文字を無視して検索したいとき: `LOWER(column_name)`
  • JSONデータの中身で検索したいとき: `(data->>’user_id’)`
  • 計算結果で並び替えをしたいとき: `(price tax_rate)`

—

最後に:使いすぎには注意!

ここまで読んで「じゃあ、全部の計算にインデックスを作っちゃおう!」と思ったあなた、ちょっと待ってくださいね。

実は、インデックスは「作れば作るほど、データを追加・更新するのが重くなる」というデメリットもあります。図書館の例でいえば、新しい本が入るたびに、普通の索引カードも小文字用の索引カードも両方書き直さないといけない……と想像すると、大変さがわかりますよね。

「よく使う検索条件」にだけ、ピンポイントでこの魔法をかけてあげる。これが、デキるエンジニアの腕の見せ所です。

皆さんのデータベースが、昨日よりも少しだけサクサク動くようになりますように!それでは、また次回の記事でお会いしましょう。

コメント

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