Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Index完全に理解した
Search
k-tky
April 30, 2020
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Index完全に理解した
こちらで発表した資料です
https://easy2.connpass.com/event/173015/presentation/
k-tky
April 30, 2020
More Decks by k-tky
See All by k-tky
複式簿記完全に理解した
ktky
0
1.7k
Other Decks in Programming
See All in Programming
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
130
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Creating Composable Callables in Contemporary C++
rollbear
0
210
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
350
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
280
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
100
1B+ /day規模のログを管理する技術
broadleaf
0
140
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
260
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
yield再入門 #phpcon
o0h
PRO
0
130
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
520
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
2
1.1k
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
We Are The Robots
honzajavorek
0
280
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
The Cult of Friendly URLs
andyhume
79
6.9k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
940
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
The Art of Programming - Codeland 2020
erikaheidi
57
14k
First, design no harm
axbom
PRO
2
1.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
220
Transcript
Index完全に理解した @k-tky
what am I? 所属 ・株式会社TOPGATE やってること ・現場作業員
とあるアプリケーションの開発. Develop... APP DB
とあるアプリケーションの開発.. Test... APP DB
とあるアプリケーションの開発... UAT... APP DB
ある日突然(突然ではない)... UAT... APP DB \オセーゾ!!!/ \ページガヒョウジサレナインダケド ?/ /ドーナッテンダ!\
アプリの遅い原因は色々あると思いますが、 今回はDB(MySQL)が悪いことにします。
DB \モウムリ / SQL SQL SQL SQL SQL SQL SQL
SQL
あー、Full Scanしてるな Index貼るか
よし、Indexアクセスになった な
ちょっと待って!そのIndex効率的? ・indexスキャンになっているが効率的なのか? indexスキャンになっているが効率的ではないことがある ・Indexとは? ・MySQLのデータ、Indexはどのような構造なのか? ・Indexを使った時のデータの取得方法は?
Indexとは? ・Indexとは索引のこと ・検索を行う時にIndexを経由してアクセスすることで、処理の高速化が図れる ・複数の列から構成されるIndexを作成することができる ・更新処理時にはIndexもメンテナンスする必要があるため、Indexのメンテナンス分の オーバーヘッドが発生する。 ・実態のデータとは別にIndexデータを保持する分、データ容量も大きくなる
MySQLの基本的なデータ、Index構造 MySQLのテーブルデータ構造 ・クラスタリングIndexと呼ばれるツリー構造で データが格納される ・root、branch、leafと辿り、leafにデータが格納さ れる MySQLのIndex構造 ・通常のIndexはB-Treeと呼ばれるツリー構造で格納 される
Indexを使った時のデータの取得方法 ・IndexはB-Treeのrootからbranch、leafへと順次データを読み込む ・leafに格納された主キーの情報を使ってテーブルデータを取得する ・テーブルデータの読み込みも rootからbranch、leafへと順次データを読み込 み、leafに格納されたデータを取得する
Indexを効率的に使えるようにするには? ・Indexを使う目的を考えてみる 検索を早くしたい ・Indexを使っても遅い原因とは? データブロックの読み込みが多いから データブロックの読み込みはIOが発生するため、非常に低速
どのようなカラムにIndexをつけるのが効率的? ・カーディナリティが高いカラムにつける カーディナリティとは、全レコード数に対するデータの種類の割合 100レコードに対してフラグなど真偽値をとる場合(2種類)は低い 100レコードに対してデータ内容が50種類ある場合は高い ・概ね20%程度にIndexで検索結果を絞れると最大効率的だと言われています。
カーディナリティの高いデータのアクセスパス ・Index→テーブルデータの順でアクセスする。 結果:読み込むデータブロックの量が少なくなる。 Indexのデータブロックを読み込み、テーブルデータのデータブロックを読み込む
カーディナリティの低いデータのアクセスパス ・Index→テーブルデータの順でアクセスする。 結果:読み込むデータブロックの量が多くなる。 Indexのデータブロックを読み込み、テーブルデータのデータブロックを読み込む
MySQLの全表アクセスパス(フルスキャン) ・全表スキャンはデータ構造のroot、branch、leafのデータブロックを読み込む leafにデータが格納されているので、 leafは横方向に読み込んでいく
Indexを効率的に使えるようにするには?(再度) ・そもそも遅い原因とは?(振り返り) データブロックの読み込みが多い ・Indexを使ってデータブロックの読み込みを少なくする Indexを使うことによってデータブロックの読み込みがどのように行われるか? Indexを使うことによってデータブロックの読み込みが多くなっていないか?
なお ・DBによってアクセスパスは変わります。 ・テーブルデータ構造も変わります。 ・DBによって特性も変わってきますので、その辺りも考慮しつつ設計してみましょう。 ・※データブロックを読み込む量を減らすことを目的としてIndexを貼ることは概ね共通だ と思います。(検索が遅い理由は基本的にデータブロックの読み込みが多いことかと)
まとめ ・Indexのメリット、デメリットを理解する よっぽどではない限り、検索が優先されると思うので貼る方向にはなると思います ・Indexは貼ればいいということではない ・Indexスキャンになっているからといって、必ずしも効率的なデータ取得がされているわ けではない ・DBごとのデータ構造、Indexの種類ごとの構造、アクセスパスを理解することで効率的 なIndex設計の手助けになればいいな、と思います。