インデックスの効用
インデックスを作成すると何が嬉しいのか、インデックスのデータの中身が何なのか、納得のいく理解ができなかったので入門記事を探しました。
意外とネット上では見つからないもので……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秒!半分ですね。
「サーバ環境などの入れ替えで,意図せず高速化する理由もうなずけるはずだ」とありますが、入れ替えしたときに異様に速く感じるアレは、マシンスペックの向上以上に、こういう要素が強いのかもしれませんね。
勉強になりました。