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
0
1.3k
Index完全に理解した
こちらで発表した資料です
https://easy2.connpass.com/event/173015/presentation/
k-tky
April 30, 2020
Tweet
Share
More Decks by k-tky
See All by k-tky
複式簿記完全に理解した
ktky
0
1.5k
Other Decks in Programming
See All in Programming
ニーリーにおけるプロダクトエンジニア
nealle
0
840
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
200
生成AI時代のコンポーネントライブラリの作り方
touyou
1
220
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
820
地方に住むエンジニアの残酷な現実とキャリア論
ichimichi
5
1.5k
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
260
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
87
29k
初学者でも今すぐできる、Claude Codeの生産性を10倍上げるTips
s4yuba
16
11k
効率的な開発手段として VRTを活用する
ishkawa
0
140
プロダクト志向なエンジニアがもう一歩先の価値を目指すために意識したこと
nealle
0
130
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
260
Result型で“失敗”を型にするPHPコードの書き方
kajitack
5
650
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Rails Girls Zürich Keynote
gr2m
95
14k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
970
Building Adaptive Systems
keathley
43
2.7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
How to Ace a Technical Interview
jacobian
278
23k
Optimizing for Happiness
mojombo
379
70k
Six Lessons from altMBA
skipperchong
28
3.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Done Done
chrislema
184
16k
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設計の手助けになればいいな、と思います。