Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Indexの種類
patorash
January 25, 2020
Technology
1
510
Indexの種類
データベースのIndexの種類について、代表的なものについて整理しました。
patorash
January 25, 2020
Tweet
Share
More Decks by patorash
See All by patorash
情報共有戦略と戦術
patorash
1
640
exists?で起きるN+1問題にSetで対処する
patorash
0
210
DBのメタデータを管理する文化を作る
patorash
0
400
Stimulusのススメ
patorash
0
35
ActiveRecordの速度改善Tips2020冬
patorash
0
35
わかった気になる!OpenID Connect
patorash
2
960
Start-SQLの紹介
patorash
0
400
RailsアプリにGraphQLを導入してみた話
patorash
1
540
Other Decks in Technology
See All in Technology
ソフトウェアテストで参考にしている67のモノ #scrumniigata / 67 things for software testing
kyonmm
PRO
1
460
TypeScript 4.7と型レベルプログラミング
uhyo
6
3.4k
Embedded SRE at Mercari
tcnksm
0
840
Nutanix_Meetup_20220511
keigotomomatsu
0
150
エンタープライズにおけるSRE立ち上げとNew Relic選定に至った背景とは / SRE Startup and New Relic in the Enterprise
tomoyakitaura
2
160
5分で完全理解するGoのiota
uji
3
2.1k
Learning from AWS Customer Security Incidents [2022]
ramimac
0
1k
Who owns the Service Level?
chaspy
5
1k
スクラムマスターの「観察」スキルを掘り下げる / Scrum Fest Niigata 2022
ama_ch
0
610
CTOのためのQAのつくりかた #scrumniigata / SigSQA How to create QA for CTOs and VPoEs
caori_t
0
250
暗号資産ウォレット入門(MetaMaskの入門~NFTの購入~詐欺の注意事項など)
kayato
2
190
キャッチアップ Android 13 / Catch up Android 13
yanzm
2
1.1k
Featured
See All Featured
The Invisible Customer
myddelton
110
11k
Debugging Ruby Performance
tmm1
65
10k
For a Future-Friendly Web
brad_frost
164
7.4k
Scaling GitHub
holman
451
140k
How to name files
jennybc
39
58k
Ruby is Unlike a Banana
tanoku
91
9.2k
Building Applications with DynamoDB
mza
83
4.6k
Practical Orchestrator
shlominoach
178
8.6k
The Mythical Team-Month
searls
208
39k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
62k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Web Components: a chance to create the future
zenorocha
303
40k
Transcript
インデックスの種類 2020-01-25 第28回 中国地方DB勉強会 @patorash 1
自己紹介 名前:尾古 豊明(おこ とよあき) twitter: @patorash 所属:株式会社リゾーム システム開発部 役職:専門職 仕事内容:
ショッピングセンターに関連するサービス開発 Ruby on Railsで自社サービスの開発・運用(7年目) データベースについて詳しくなりたい。OSS-DB Silver取得済み。 現在、データベーススペシャリスト試験に向けて勉強中 2
OSS-DB Silverを受けた頃のワイ 3 よくわからんけど普通に使うのB-Tree Indexだけじゃない? B-Tree Index理解しとけばいいや。 よし、Index完全に理解した。
データベーススペシャリストの勉強をしてるワイ 4 まったくわからない。 俺は雰囲気でIndexを使っている。
Indexについて整理 5
Indexの種類 • B-tree Index • Bitmap Index • Hash Index
• その他(GiSTとか)※今回は取り上げない 6
B-tree Index • PostgreSQLのデフォルトのIndex • MySQLはストレージエンジンによって デフォルトは異なるが、 Inno DBだと デフォルトのIndex
• 木構造で作られる • BはBalanced • カーディナリティ(選択性)が 高い列に有効 • カーディナリティが低い列だと フルスキャンが発生する • 範囲検索でも使える 31 17 20 35 42 10 15 32 33 37 39 50 52 18 19 25 30 ※EXAM PRESS うかる!データベーススペシャリスト より抜粋 7
Bitmap Index • Bitmap形式のIndex ◦ 0と1で表現 • カーディナリティの低い場合に有効 ◦ 性別、権限、カテゴリー等の種類の少ない
ケースのこと • PostgreSQLの場合、明示的にこの Indexを 指定することはできないが、実行時に Bitmapを作成し、それを使ってスキャンする ことがある ◦ Bitmapの作成にコストがかかるが、 それでもフルスキャンに比べるとマシ というケースで発動 8 性別 権限 浜田 男 管理者 松本 男 編集者 今田 男 ゲスト 東野 男 編集者 板尾 男 管理者 蔵野 男 ゲスト 篠原 女 編集者 YOU 女 ゲスト
Bitmap Index • Bitmap形式のIndex ◦ 0と1で表現 • カーディナリティの低い場合に有効 ◦ 性別、権限、カテゴリー等の種類の少ない
ケースのこと • PostgreSQLの場合、明示的にこの Indexを 指定することはできないが、実行時に Bitmapを作成し、それを使ってスキャンする ことがある ◦ Bitmapの作成にコストがかかるが、 それでもフルスキャンに比べるとマシ というケースで発動 9 男性 女性 管理者 編集者 ゲスト 浜田 1 0 1 0 0 松本 1 0 0 1 0 今田 1 0 0 0 1 東野 1 0 0 1 0 板尾 1 0 1 0 0 蔵野 1 0 0 0 1 篠原 0 1 0 1 0 YOU 0 1 0 0 1
Bitmap Index • Bitmap形式のIndex ◦ 0と1で表現 • カーディナリティの低い場合に有効 ◦ 性別、権限、カテゴリー等の種類の少ない
ケースのこと • PostgreSQLの場合、明示的にこの Indexを 指定することはできないが、実行時に Bitmapを作成し、それを使ってスキャンする ことがある ◦ Bitmapの作成にコストがかかるが、 それでもフルスキャンに比べるとマシ というケースで発動 • 男で管理者、という条件にしたら、浜田と板 尾がすぐに浮かび上がる 10 男性 女性 管理者 編集者 ゲスト 浜田 1 0 1 0 0 松本 1 0 0 1 0 今田 1 0 0 0 1 東野 1 0 0 1 0 板尾 1 0 1 0 0 蔵野 1 0 0 0 1 篠原 0 1 0 1 0 YOU 0 1 0 0 1
Hash Index • 値のHash値を作るIndex • 完全一致の際に効果的 • 範囲検索はできない • Indexの物理量の増え方が一定になる
• PostgreSQLでは使えるが非推奨 ◦ WALに書き込めない ◦ ストリーミングレプリケーションで 使えない 11 メールアドレス Hash値 浜田 hamada@example.com 723E7 松本 matsumoto@example.com 83AB4 今田 imada@example.com 15D1C 東野 higasino@example.com 9AB2F 板尾 itao@example.com 699FE 蔵野 kurano@example.com 1DAF8 篠原 shinohara@example.com 3E783 YOU you@example.com AB415
OSS-DB Silverを受けた頃のワイ 12 よくわからんけど普通に使うのB-Tree Indexだけじゃない? B-Tree Index理解しとけばいいや。 よし、Index完全に理解した。
PostgreSQL10でHash Indexが強化! 13
Hash Index • 値のHash値を作るIndex • 完全一致の際に効果的 • 範囲検索はできない • Indexの物理量の増え方が一定になる
• PostgreSQL 9.xでは使えるが非推奨 ◦ WALに書き込めない ◦ ストリーミングレプリケーションで 使えない • PostgreSQL 10以上で使える! ◦ WALに書き込める! ◦ ストリーミングレプリケーションで 使える! 14 メールアドレス Hash値 浜田 hamada@example.com 723E7 松本 matsumoto@example.com 83AB4 今田 imada@example.com 15D1C 東野 higasino@example.com 9AB2F 板尾 itao@example.com 699FE 蔵野 kurano@example.com 1DAF8 篠原 shinohara@example.com 3E783 YOU you@example.com AB415
Hash Indexを試してみた • データ1万件程度 • ユニーク制約のついた列 • 完全一致で利用 • B-Tree
Indexと速度面・データ量で比較 15
結果 • 検索速度はB-Tree Indexと、ほぼ変わらず • 実行計画では、Hash Indexでは若干コストが低い • Indexのデータ量も1万件程度だと、ほぼ変わらず ◦
行数が増えるとHash Indexのほうがデータ量的に少なくて済んだという記事を見た (@nuko_yokohamaさんの記事) ◦ 1000万行入れた時のデータについて。 ◦ https://qiita.com/nuko_yokohama/items/05ece8313af0f81a870d 16
まとめ B-Tree Indexを使っておけば、基本は大丈夫。 Bitmap Index はクエリ実行時に自動で作られる。(B-Tree Indexは必要) Hash Indexは(ほぼ)ユニークで完全一致のケースならば有効。 使ってみてはいかがでしょうか?(ただし、PostgreSQL
10以上) 適用できそうな例: • メールアドレス • 電話番号 • ユーザーコード • 認証系 • アクセスキー • アクセスシークレット 他にありそうな例があったら教えてください! 17