Slide 1

Slide 1 text

Index完全に理解した @k-tky

Slide 2

Slide 2 text

what am I? 所属 ・株式会社TOPGATE やってること ・現場作業員

Slide 3

Slide 3 text

とあるアプリケーションの開発. Develop... APP DB

Slide 4

Slide 4 text

とあるアプリケーションの開発.. Test... APP DB

Slide 5

Slide 5 text

とあるアプリケーションの開発... UAT... APP DB

Slide 6

Slide 6 text

ある日突然(突然ではない)... UAT... APP DB \オセーゾ!!!/ \ページガヒョウジサレナインダケド ?/ /ドーナッテンダ!\

Slide 7

Slide 7 text

アプリの遅い原因は色々あると思いますが、 今回はDB(MySQL)が悪いことにします。

Slide 8

Slide 8 text

DB \モウムリ / SQL SQL SQL SQL SQL SQL SQL SQL

Slide 9

Slide 9 text

あー、Full Scanしてるな Index貼るか

Slide 10

Slide 10 text

よし、Indexアクセスになった な

Slide 11

Slide 11 text

ちょっと待って!そのIndex効率的? ・indexスキャンになっているが効率的なのか?  indexスキャンになっているが効率的ではないことがある ・Indexとは? ・MySQLのデータ、Indexはどのような構造なのか? ・Indexを使った時のデータの取得方法は?

Slide 12

Slide 12 text

Indexとは? ・Indexとは索引のこと ・検索を行う時にIndexを経由してアクセスすることで、処理の高速化が図れる ・複数の列から構成されるIndexを作成することができる ・更新処理時にはIndexもメンテナンスする必要があるため、Indexのメンテナンス分の オーバーヘッドが発生する。 ・実態のデータとは別にIndexデータを保持する分、データ容量も大きくなる

Slide 13

Slide 13 text

MySQLの基本的なデータ、Index構造 MySQLのテーブルデータ構造 ・クラスタリングIndexと呼ばれるツリー構造で データが格納される ・root、branch、leafと辿り、leafにデータが格納さ れる MySQLのIndex構造 ・通常のIndexはB-Treeと呼ばれるツリー構造で格納 される

Slide 14

Slide 14 text

Indexを使った時のデータの取得方法 ・IndexはB-Treeのrootからbranch、leafへと順次データを読み込む ・leafに格納された主キーの情報を使ってテーブルデータを取得する ・テーブルデータの読み込みも rootからbranch、leafへと順次データを読み込 み、leafに格納されたデータを取得する

Slide 15

Slide 15 text

Indexを効率的に使えるようにするには? ・Indexを使う目的を考えてみる  検索を早くしたい ・Indexを使っても遅い原因とは?  データブロックの読み込みが多いから  データブロックの読み込みはIOが発生するため、非常に低速

Slide 16

Slide 16 text

どのようなカラムにIndexをつけるのが効率的? ・カーディナリティが高いカラムにつける  カーディナリティとは、全レコード数に対するデータの種類の割合  100レコードに対してフラグなど真偽値をとる場合(2種類)は低い  100レコードに対してデータ内容が50種類ある場合は高い ・概ね20%程度にIndexで検索結果を絞れると最大効率的だと言われています。

Slide 17

Slide 17 text

カーディナリティの高いデータのアクセスパス ・Index→テーブルデータの順でアクセスする。  結果:読み込むデータブロックの量が少なくなる。  Indexのデータブロックを読み込み、テーブルデータのデータブロックを読み込む

Slide 18

Slide 18 text

カーディナリティの低いデータのアクセスパス ・Index→テーブルデータの順でアクセスする。  結果:読み込むデータブロックの量が多くなる。  Indexのデータブロックを読み込み、テーブルデータのデータブロックを読み込む

Slide 19

Slide 19 text

MySQLの全表アクセスパス(フルスキャン) ・全表スキャンはデータ構造のroot、branch、leafのデータブロックを読み込む  leafにデータが格納されているので、 leafは横方向に読み込んでいく

Slide 20

Slide 20 text

Indexを効率的に使えるようにするには?(再度) ・そもそも遅い原因とは?(振り返り)  データブロックの読み込みが多い ・Indexを使ってデータブロックの読み込みを少なくする  Indexを使うことによってデータブロックの読み込みがどのように行われるか?  Indexを使うことによってデータブロックの読み込みが多くなっていないか?

Slide 21

Slide 21 text

なお ・DBによってアクセスパスは変わります。 ・テーブルデータ構造も変わります。 ・DBによって特性も変わってきますので、その辺りも考慮しつつ設計してみましょう。 ・※データブロックを読み込む量を減らすことを目的としてIndexを貼ることは概ね共通だ と思います。(検索が遅い理由は基本的にデータブロックの読み込みが多いことかと)

Slide 22

Slide 22 text

まとめ ・Indexのメリット、デメリットを理解する  よっぽどではない限り、検索が優先されると思うので貼る方向にはなると思います ・Indexは貼ればいいということではない ・Indexスキャンになっているからといって、必ずしも効率的なデータ取得がされているわ けではない ・DBごとのデータ構造、Indexの種類ごとの構造、アクセスパスを理解することで効率的 なIndex設計の手助けになればいいな、と思います。