SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

直近開催のイベントはこちら!

EnterpriseZine編集部ではイベントを随時開催しております

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

MySQLチューニング虎の巻

MySQLにおけるJOINのチューニングの定石

001


 MySQLのEXPLAINでは関連する各テーブルごとにそれぞれ情報が出力される。EXPLAINで表示されている順序がJOINの順序を表している。すなわち、ここではCountryテーブルが駆動表、Cityテーブルが内部表ということになる。SELECTで指定した順序とは逆になっているのは、オプティマイザによってSELECTで記述されたものとは異なる順序が選択されたという点に留意されたい。NLJではJOINの順序が重要なポイントであるが、EXPLAINを実行すればひと目で分かるのである。

 次に読み取るべきなのは、NLJにおいてもうひとつのポイントであるインデックスに関する情報だ。上記の例では内部表はCityテーブルであり、JOINが効率的であるかを判断するにはCityテーブルがインデックスが効果的に使われているかどうかが判断基準となる。possible_keysフィールドは使用可能なインデックスの一覧だ。この例ではPRIMARY(主キー)しか表示されていないが、これはCityテーブルにはそもそも主キーしか存在しないため他に挙げるべきインデックスがないからである。テーブルに複数のインデックスがある場合には複数のインデックスが列挙されることになる。keyフィールドは利用可能なインデックスのうち、実際に選択されたインデックスを示す。ここでもPRIMARYが選択されており、内部表へのアクセスには主キーが用いられることが分かる。key_lenフィールドは選択されたインデックスのキー長である。

 テーブルへのアクセスがどのように行われるかを、より詳細に知るにはtypeフィールドとrefフィールドを見る。typeフィールドは別名レコードアクセスタイプと呼ばれ、まさしくテーブルへアクセスする方法の種類を示す。レコードアクセスタイプには次の種類がある。

タイプ 説明
const PRIMARY KEYまたはUNIQUEインデックスのルックアップ(等価比較)によるアクセス
eq_ref JOINにおいて内部表から行のフェッチがPRIARY KEYまたはUNIQUE KEYにのルックアップよって行われることを示す。constと似ているがJOINで用いられるところが違う
ref ユニーク(PRIMARY or UNIQUE)でないインデックスを使って等価検索(WHERE key = value)を行った時に使われるアクセスタイプ
range インデックスを用いた範囲検索
ALL フルテーブルスキャン
index フルインデックススキャン
 上記の例ではCountryテーブルがALLとなっているが、Countryテーブルに対してテーブルスキャンが行われるということが分かる。一方でCityテーブルは主キーとの等価比較(ルックアップ)によってアクセスされるためeq_refとなっている。

 refフィールドにはインデックスと比較されるフィールドの名前が表示される。この例のSELECTでは結合条件は「ON (City.Id = Country.Capital)」なので、refフィールドは「world_innodb.Country.Capital」となっている。ちなみに、駆動表でインデックスがリテラル値によって検索される場合には、refフィールドはconstとなる。

 Extraフィールドはオプティマイザがどのような判断を行ったかということに関するヒントが表示される。オプティマイザの独り言のようなものであるが、オプティマイザの挙動を把握する上で実は見逃せないフィールドである。この例では「Using where」と表示されているが、これはテーブルからレコードをフェッチしてからWHERE句の検索条件によって絞り込みを行うことを示す。インデックスを用いたアクセスであっても、カラムがNOT NULLに設定されていないと出力される。これはよく出るヒントであり、恐らくMySQLでEXPLAINを実行したことがある人ならば必ず一度は「Using where」の文字を目にしたことがあるだろう。紙面の都合上、Extraフィールドのその他の値についての解説は今回割愛する。

 あまり重要な情報ではないが、idフィールドとselect_typeフィールドについても解説しておこう。idフィールドはSELECTを構成するJOINにそれぞれつけられる。上記のクエリは2つのテーブルをJOINしているので、SELECTの構成単位であるJOINはひとつしかない。そのため全てのテーブルで共通のidである「1」が割り当てられている。次に、select_typeフィールドはSIMPLEとなっているが、これはSELECTの種類がJOINであることを示すものである。どれだけ複雑なJOINが行われていても、いくつのテーブルをJOINしても、サブクエリやUNIONが含まれていなければSIMPLEとなる。

次のページ
まとめ

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
MySQLチューニング虎の巻連載記事一覧

もっと読む

この記事の著者

奥野 幹也 (オクノ ミキヤ)

日本オラクル株式会社
MySQL Global Business Unitテクニカルアナリスト

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/3520 2012/02/10 18:06

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング