インデックスの効用

インデックスを作成すると何が嬉しいのか、インデックスのデータの中身が何なのか、納得のいく理解ができなかったので入門記事を探しました。
意外とネット上では見つからないもので……howの部分はネット上でみつかるけど、whyの部分はやっぱり書籍が強いなぁ。


やはりこういうのはMySQLの入門書等を読むべきなのでしょうね。
ただ手元にないので、無理矢理ネットで探してみました。



インデックスを作成すると何が嬉しいのか

以下の記事のP1からP3が詳しいです。


▽[MySQLウォッチ]第38回 インデックスの劣化と再生(ITPro)
 http://itpro.nikkeibp.co.jp/article/COLUMN/20071113/287093/


郵便番号のフィールドにインデックスを作成しない場合、郵便番号の検索が0.42秒。
一方、郵便番号のフィールドにインデックスを作成した場合、

select * from pono where po = '1500002' \G

という同じ検索文で0.03秒。10倍以上高速化したよ、と。


1つのテーブルしかない(但し大量の中身がある)、このようなデータでも、これだけ違いがでるのですね。


インデックスのデータの中身が何なのか

上記P4によれば、「インデックスは,検索処理やソート処理のために対象の列の値を整理して,レコードの位置を記録している」そうです。


本の●ページを読みたい、という時にインデックスがないと、頭から順番にページをめくって、ページ数を確認しながら●ページにたどり着かないといけない。
これに対し、インデックスがあると、冒頭の索引(インデックス)のページに●ページの物理的な位置が書いてあって、索引の中から見つかれば、物理的な位置を直接開けてあっという間に解決。


そういう感じなのでしょうか。
なんとなくイメージがついてきました。


インデックスの作成方法

CREATE TABLE test (
blob_col BLOB,
INDEX(blob_col(10))
);

シンプルです(^^;


MySQL 5.1 リファレンスマニュアル :: 6 最適化 :: 6.4 データベース構造の最適化 :: 6.4.3 カラムインデックス
 http://dev.mysql.com/doc/refman/5.1/ja/indexes.html


MySQL 5.1 リファレンスマニュアル :: 6 最適化 :: 6.4 データベース構造の最適化 :: 6.4.4 複合インデックス
 http://dev.mysql.com/doc/refman/5.1/ja/multiple-column-indexes.html


結論

冒頭のITProの記事は、explainで処理内容を確認する方法と、explainで表示される項目の説明も書いてあります。
こうやって検証するんですね〜。


本題の「インデックスの劣化と再生」自体も勉強になりました。
インデックスのフラグメンテーションを解消すると0.06秒から0.03秒!半分ですね。


「サーバ環境などの入れ替えで,意図せず高速化する理由もうなずけるはずだ」とありますが、入れ替えしたときに異様に速く感じるアレは、マシンスペックの向上以上に、こういう要素が強いのかもしれませんね。


勉強になりました。