I_Sの最適化
INFORMATION_SCHEMAに対してクエリを行うSELECTに対してEXPLAINを実行すると、Extraフィールドに以下のメッセージが表示されます。
上記のうち、Skip_open_table、Open_frm_only、Open_full_tableのどれが表示されるかは、INFORMATION_SCHEMA内のテーブルのどのカラムへアクセスするかによって決まっています。(上記のクエリ例でSELECTされているカラムを見て下さい。)Scanned X databasesは、どれだけデータベースやテーブルが具体的に指定されているかで決まります。テーブル名がより具体的に指定されているほうがクエリの効率が良いということになります。
- Skip_open_table ... テーブルをまったくOpenする必要がない場合(データベースディレクトリのエントリを見るだけでクエリが解決できる場合)に表示されます。(クエリ例:select table_name from tables;)
- Open_frm_only... .frmファイル(テーブル定義ファイル)をOpenするだけでクエリを解決できる場合に表示されます。(クエリ例:select table_name, engine from tables;)
- Open_full_table... .frmファイルだけでなく実際にテーブルをOpenする(MyISAMの場合は.MYDや.MYIファイルを開く)必要がある場合に表示されます。(クエリ例:select table_name, data_free from tables;)
- Scanned 0 databases... データベースのスキャンをする必要がない場合に表示されます。(クエリ例:select table_name from tables where table_schema='test' and table_name='t1';)
- Scanned 1 database... データベースを一つだけスキャンする必要がある場合に表示されます。(クエリ例:select table_name from tables where table_schema='test';)
- Scanned all databases... 全てのデータベースをスキャンする必要がある場合に表示されます。(クエリ例:select table_name from tables;)
このネタはちょっとマニアック過ぎて現場で必要になることはないだろう。(ということでカットしたのだが。)しかし、DBAならI_Sを用いてデータベースを監視することもあると思うので、その時に如何に効率的なクエリを書くか?ということは考える必要があるかも知れない。
書籍ではネタをスリム化して内容の濃ゆ〜〜〜いものを提供するので乞うご期待!
0 コメント:
コメントを投稿