RDBMS#
インデックス#
インデックスを貼ると、基本的にはデータがB-tree構造で保持されて\(O(n)\)ではなく\(O(\log n)\)で検索できるようになる。 よって、WHERE句などで特定の値を検索されるカラムはインデックスを張ったほうがよい。
複合インデックス#
複数のカラムにまたがって作成するインデックスを 複合インデックス (composite index)という。 WHERE句で複数のカラムを条件に使う場合、それらを含む複合インデックスを張っておくと検索を高速化できる。
カーディナリティの高い列にインデックスを張る#
値の種類が多いもの(例えば建物のテーブルにおける市区町村idなど)で絞り込むと効率的にレコード数を減らせる。 そうしたカラムに優先的にインデックスを貼り、WHERE句の条件でも使う。
例
クエリ側も絡めた話になるが、例えば日本全国の建物を含むbuildingsというテーブルがあったとして、
SELECT *
FROM buildings
WHERE "総階数" <= 10
AND "竣工年" BETWEEN 2000 AND 2025
AND "市区町村id" = 11000
のような絞り込み条件だと、総階数と竣工年で絞った時点で残っている物件がまだまだあり、最後に市区町村で絞るのが遅い。代わりに
SELECT *
FROM buildings
WHERE "市区町村id" = 11000
AND "総階数" <= 10
AND "竣工年" BETWEEN 2000 AND 2025
のように市区町村idで絞り込めば、もっと効率的になる可能性が高い