More info...

2010-01-11

MySQLでINFORMATION_SCHEMAへのアクセス時に利用される最適化アルゴリズム

実は今、延び延びになってしまっている著書の推敲をしているのだが、編集者からページ数を減らすよう言われてしまっていて色々とネタを削っている。せっかく書いたし勿体ないので削ったネタをブログに貼っておく。とりあえずは以下。また面白いネタがあったら貼るかも。

I_Sの最適化


INFORMATION_SCHEMAに対してクエリを行うSELECTに対してEXPLAINを実行すると、Extraフィールドに以下のメッセージが表示されます。

  • 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;)
上記のうち、Skip_open_table、Open_frm_only、Open_full_tableのどれが表示されるかは、INFORMATION_SCHEMA内のテーブルのどのカラムへアクセスするかによって決まっています。(上記のクエリ例でSELECTされているカラムを見て下さい。)Scanned X databasesは、どれだけデータベースやテーブルが具体的に指定されているかで決まります。テーブル名がより具体的に指定されているほうがクエリの効率が良いということになります。

このネタはちょっとマニアック過ぎて現場で必要になることはないだろう。(ということでカットしたのだが。)しかし、DBAならI_Sを用いてデータベースを監視することもあると思うので、その時に如何に効率的なクエリを書くか?ということは考える必要があるかも知れない。

書籍ではネタをスリム化して内容の濃ゆ〜〜〜いものを提供するので乞うご期待!

0 件のコメント:

コメントを投稿