EXPLAINを活用して遅いクエリをチューニング

EXPLAINを利用するとクエリの実行計画を確認することができます。遅いクエリをチューニングする際に活躍します。

検証テーブル

下記テーブルを例に説明します。

table_a

idcodeA
1i+Pc_RBu
24dDTZ543
3uE7qK_Ve
(省略)
10000P)_3d14V

table_b

idcodeBtable_a_id
16UxiNqqo6821
2dD+>70E02847
3$+HRjlbY7963
(省略)
10000Zq7mKwSF8683

table_a、table_bというテーブルを作成し、それぞれ1万件のテストデータを挿入しています。両テーブルともまだインデックスが作られいません。

相関サブクエリは遅い

まず、下記2つのSQLクエリの処理を確認してみます。

SELECT table_b.*, table_a.codeA
FROM table_b
LEFT JOIN table_a
ON table_b.table_a_id = table_a.id
SELECT table_b.*, (SELECT table_a.codeA 
                   FROM table_a
                   WHERE table_a.id = table_b.table_a_id) as codeA
FROM table_b

2つのSQLクエリの結果は同じですが、実行時間に大きな差がありました。
結合を利用した場合 ⇒ 0.0276 秒
相関サブクエリを利用 ⇒ 0.1154 秒

相関サブクエリの計算量は次のようになります。
外部クエリでフェッチされる件数 × サブクエリでフェッチされる件数

計算量が多くなってしまいがちなので、相関サブクエリを利用しない方法を検討したほうが良いかと思います。

EXPLAINによる実行計画の確認

EXPLAINを使ってクエリの実行計画を確認していきます。

結合を利用したクエリ

EXPLAIN
SELECT table_b.*, table_a.codeA
FROM table_b
LEFT JOIN table_a
ON table_b.table_a_id = table_a.id
410-mysql-explain_join1.png

相関サブクエリを利用したクエリ

EXPLAIN
SELECT table_b.*, (SELECT table_a.codeA 
                   FROM table_a
                   WHERE table_a.id = table_b.table_a_id) as codeA
FROM table_b
410-mysql-explain_subquery1.png

keyがNULLになっていますね。つまり、全レコードが評価対象になっています。

インデックスを作成

全レコードが評価対象にならないようにするため、インデックスを次のように作成します。

ALTER TABLE `testdb`.`table_a` ADD INDEX  (`id`)

インデックス作成後の実行計画

再度、EXPLAINを使ってクエリの実行計画を確認します。

結合を利用したクエリ

410-mysql-explain_join2.png

相関サブクエリを利用したクエリ

410-mysql-explain_subquery2.png

keyが利用されていますね。実行時間は次のようになりました。
結合を利用した場合 ⇒ 0.0007 秒
相関サブクエリを利用 ⇒ 0.0006 秒

簡単でしたが、EXPLAINを利用したSQLチューニングの紹介でした。常にEXPLAINでSQLの実行計画を確認する習慣をつけると良いかと思います。

補足|複数のインデックス候補があるとき

複数のインデックス候補があるときには、カーディナリティの高いカラムを優先してインデックスをつけます。

カーディナリティとは、キーの値の数全レコード数の比率のことです。リレーションシップのカーディナリティ(1対多など)とは、また別の意味です。

例えば、「男」「女」の値をとる性別カラムより、都道府県カラムのほうが、とりうるデータの種類が多いため、カーディナリティが高いといえます。

【エンジニア向け】仕事を見つける方法

転職する

転職エージェントを活用する

転職サイトの場合、自身でサイト上から企業を探す必要があります。 一方「レバテックキャリア」 などの転職エージェントの場合、エージェントが企業を紹介してくれます。エージェントが間に入ることにより、日程調整や、条件交渉などもサポートしてくれます。

転職ドラフトを活用する

転職ドラフト」は、 企業がITエンジニアをドラフトという形で指名するサービスです。年収が最初に提示されるなどのメリットがあります。 ただ、初回登録時にレジュメ作成が必要で、すでにエンジニア経験が豊富にあるエンジニア向けのサービスかと思います。 レジュメ作成が手間ですが、自身のキャリアを見直す機会になり、他の仕事探しにも役立つはずです。

エンジニア転職保証のあるスクールを活用する

ある程度、開発経験のあるかたであれば、独学で必要なスキルを身につけることができるはずです。ただ、別業種からエンジニアに転職したい場合など、1から独学で学ぶのはハードルが高いです。そういった方は、スクールの活用を検討しても良いと思います。 「TechAcademy」は、エンジニア転職保証コースを提供しています。給付金制度の対象講座として認定されているため、金銭面の負担も抑えることができます。

フリーランスとして活動する

レバテックフリーランス」「ITプロパートナーズ」「ギークスジョブ」は、フリーランスエージェントサービスです。 エージェントによって、支払いサイトなど細かい違いはありますが、まずは良い案件を見つけることが重要です。 登録自体は無料なので、複数エージェントに登録して、より多くの案件を紹介してもらうのがおすすめです。

logo
わくわくBank.
技術系の記事を中心に、役に立つと思ったこと、整理したい情報などを掲載しています。