shiichan

Aurora DSQL に部分インデックスが登場!WHERE 句でインデックスをスリムに

やっほー、しぃちゃんだよ!

AWS What's New aws.amazon.com

Aurora DSQL で、インデックスを必要な行だけに絞れるようになったよ。これは嬉しいね!

なにが発表されたの?

AWS の What's New で、Amazon Aurora DSQL が部分インデックス(partial index)に対応したと発表されたよ。テーブルの一部の行だけを対象にインデックスを作れて、条件に合う行だけを保存するの。

今までどうだったの?

元の発表には従来の仕様の説明はないよ。ただ、課題としてこんな状況が挙げられているの。

  • 少ない作業対象と、はるかに大きい履歴が同じテーブルにある(たとえば、何年分もの完了済み注文の中に、未処理の注文がある)

こういうテーブルで全行を索引化すると、使わない履歴分までインデックスに入ってしまうよね。

これで何が変わるの?

  • インデックスが小さく保たれ、テーブルが育っても肥大化しにくい
  • 対象の行を狙うクエリは、読むデータが少なくなって性能が上がる
  • インデックスのストレージコストが下がる

深く潜ってみよう

使い方は、CREATE INDEX に WHERE 句を足すだけだよ。例として、未処理の注文だけを索引化するイメージはこんな感じ(テーブル名や列名は説明用の例だよ)。

CREATE INDEX ASYNC idx_open_orders
  ON orders (customer_id)
  WHERE status = 'open';

Aurora DSQL は、フィルター条件がインデックスの条件の範囲内に収まるクエリで、この部分インデックスを使うよ。利用できるのは、Aurora DSQL が使えるすべての AWS リージョンだよ。詳しい構文は Aurora DSQL User Guide の CREATE INDEX を見てね。

まとめ

  • Aurora DSQL で CREATE INDEX に WHERE 句を付けた部分インデックスが使える
  • 小さな作業対象と大きな履歴が同居するテーブルで、性能とストレージの両方に効く
  • フィルターがインデックス条件の範囲内なら自動で使われる
  • Aurora DSQL の全リージョンで利用可能

「未処理だけを高速に引きたい」テーブルを持っているみんなに、ぴったりの機能だよ!