index
検索する際に、full table scanと比べて速度を向上するために使うメタデータ
1つのtable内の、1つ以上のcolumnに対して作る
大きくrecordを絞り込める検索条件が存在する場合のみ有効
実際のtableとは別に、検索に適した形にしたメタデータのtableを作る
検索する際は、そのメタデータのtableを参考にして検索する
例えば、以下のようなtableがあった時
table:order
order_id price date
1 1000 ..
2 3000 ..
3 2500 ..
.. .. ..
主キーであるorder_idで絞り込む場合は一発で特定可能
しかし、where price = 2500とする場合は上から順に全record見るしか無い
そこで、以下のようにpriceでsortしたメタデータを管理するtableを別途用意する
table:meta
price order_id
1000 1
2500 3
3000 2
3000 10
... ...
sortされているので、全record見る必要がなくなった
このmeta tableをいくつかのレンジごとに分割するとさらに効率が良くなる
meta1はpriceが0~10000のデータ
meta2はpriceが10000~20000のデータ
...
とやっていけば、where price = 11000とした時に、meta2を見るだけで済む
これはまさにtree構造をやっているのと同じ
こういう感じのことをやっているのがindex
トレードオフがかなりある
追加/更新/削除する場合は、Indexも更新する必要があるため時間がかかる
検索の場合も、常に速くなるとは限らない
検索条件や、データの分布によってはfull scanした方が速いこともある
そのため、仕組みとユースケースを見比べて設計する必要がある
以下のようなcolumnは自動的にindexが作られる
主キー
外部キー
UNIQUE制約があるcolumn
そのため、これらに自分でIndexを作っても無意味
代表的なアルゴリズム
B-treeインデックス
ほぼこれ
ビットマップインデックス
ハッシュインデックス
参考
JTF2021 C07 『結局「インデックス」ってなんなんですか? - PostgreSQL の仕組みからインデックスの理解を深める』 - YouTube
概要。説明の流れがめっちゃ良い
/mrsekut-book-4798124702/284 (第6章 データベースとパフォーマンス)
基本
/mrsekut-book-4774173010/316 (第10章 インデックスを使いこなす)
#WIP
https://use-the-index-luke.com/ja
indexの本
構文
code:sql
CREATE INDEX <index名> ON <table名>(<column名>)
code:sql
DROP INDEX <index名> ON <table名>
indexの設計
query optimizerが、indexを使うか、full scanするか判断してくれることもあるらしい
#??
型の指定の仕方でindexの効用って変化する?
1つのtableに対し、2つのindexを作ると、2つのツリーができる?
ということは更新時にはより遅くなる?
↑で向き不向きがあるのね
B-treeはBETWEEN検索に有効
AND, OR, NOT検索はビットマップインデックスが有効
どのタイミングで更新されるのか
追加・更新・削除があると毎回創るのか
ちょっとバッジ的にまとめて更新することもできるのか
複数のインデックスを併用することってできるの?
indexを作った場合、基本的にsortしたツリーが別途作られるってこと?
sort以外にあるのかな
統計情報
複合インデックス
1table内の複数のcolumnにindexを作る
2つのcolumn AとBを一緒にwhere a = .. and b = ...という感じでよく使うことがあるなら有効
https://qiita.com/towtow/items/4089dad004b7c25985e3
indexの定義
https://www.techscore.com/blog/2019/12/25/performance_index/
https://qiita.com/kkyouhei/items/e3502ef632c48d94541d
https://qiita.com/wakuwaku_gattuso/items/c44b5cc2b6b81bd9cd56