見出し画像

SQLの性能改善

こんにちは!
ALH横浜事業所のTOMOKIです!

今回は、SQLの性能改善について解説をいたします。
皆様もこのSQLが遅いな、と感じたことはないでしょうか?
是非、今回の内容を試してみてください!


SELECT句の「*」

多くの方が利用する、テーブルのすべてのカラムを取得する「*」ですが、
実はカラムの数が多いとSQLのパフォーマンスに影響を与えていることも少なくありません。

利用しないカラムまで「*」で取得している場合は、
必要なカラムだけ取得するように変更するだけで性能の改善が期待できます。

【サンプル】
変更前

SELECT
  *
FROM
  sample_table;

変更後

SELECT
  column1,column3
FROM
  sample_table;

複合インデックス

複合インデックスを指定した場合、条件に指定するカラムをインデックスに定義をしたカラム順で指定しないと、インデックスが聞かないといった問題が起こります。

インデックスを効かせるためには、インデックスで定義された順番と同じ順序で条件式を指定するようにしましょう。

【サンプル】
まずは複合インデックスを付与します。

ALTER TABLE sample_table ADD INDEX(column1, column3, column4);

そうしたら、条件を指定したSQLを作成してみます。

複合インデックスが有効な記述

SELECT 
  column1, column2
FROM 
  sample1
WHERE column1 = 1
AND   column3 = 2
AND   column4 = 3;

複合インデックスで定義した通りの順番なので、インデックスは有効に働きます。

複合インデックスが無効な記述

SELECT 
  column1, column2
FROM 
  sample1
WHERE column4 = 3
AND   column3 = 2
AND   column1 = 1;

複合インデックスで定義した順番と違うので、インデックスは無効化されてしまいます。

WHERE句の条件指定順

WHERE句で複数条件を指定する場合、記述した順番に処理が実施されていきます。

そのため、最初に絞り込んだ際の結果が少なくなる条件を指定したほうが、後述の条件にかかる負担が少なくなります。

【サンプル】
例えばテーブルに1000件のデータが入っているとして、「年齢」と「性別」のカラムが存在するとします。

+------+-----------------+------+------+
| id   | name            | age  | sex  |
+------+-----------------+------+------+
|    1 | 山田太郎         |   30 | 男   |
|    2 | 山田花子         |   25 ||
|    3 | 鈴木二郎         |   20 | 男   |
|    4 | 田中はじめ       |   40 ||
|    5 | 田中ひかり       |   19 | 女   |
|  etc | etc             |  etc | etc |
+------+-----------------+------+------+

性別を先に指定

SELECT 
  id, name
FROM 
  テーブル名
WHERE sex = '男'
AND   age = 30;

この場合、性別を先に絞り込んでいるため、単純に男女同数のデータが存在するテーブルであれば半分のデータが残ってしまいます。

年齢を先に指定

SELECT 
  id, name
FROM 
  テーブル名
WHERE age = 30
AND   sex = '男';

一方で、年齢を先に指定した場合、半分よりも少ないデータになることは間違いありません。

このようにWHERE句の条件指定が複数存在する場合には、絞り込んだ結果が少なくなるような条件を先に記述した方が、SQLのパフォーマンスが上がります。

テーブルに別名を付ける

SQLは実行時に解析が行われますが、テーブルに別名を付けた上で、全ての列名に接頭辞を付けた方が処理が早くなるようです。

【サンプル】

非推奨

SELECT 
  カラム名1,カラム名2
FROM 
  テーブル名1
INNER JOIN
  テーブル名2
ON カラム名 = カラム名
WHERE
  カラム名1 = '1';

このように、カラム名の取得元テーブルをデータベースに判断させるのでは処理が遅くなります。

推奨

SELECT 
  a.カラム名1,b.カラム名2
FROM 
  テーブル名1 a
INNER JOIN
  テーブル名2 b
ON a.カラム名 = b.カラム名
WHERE
  a.カラム名1 = '1';

推奨で記述したSQLのように、テーブル名に別名を割り当ててカラムの接頭辞全てに指定してあげると、SQLの解析が早くなるようです。

最後に

本記事では、SQLのパフォーマンス改善方法として、基本的な手法をご紹介しました。

SQLのパフォーマンスチューニングは非常に奥の深い分野で、今回ご紹介した内容は入り口であり、まだまだ様々なチューニング方法が存在します。

これまで必要なデータが取得さえ出来ていれば、SQLのパフォーマンスに関しては意識してなかったという方は、ぜひ今回ご紹介した内容から始めて、徐々により高度な知識を身につけて、パフォーマンスの高いSQL文を記述出来るように取り組んでみましょう!



ALHについて知る



↓ ↓ ↓ 採用サイトはこちら ↓ ↓ ↓ 


↓ ↓ ↓ コーポレートサイトはこちら ↓ ↓ ↓


↓ ↓ ↓ もっとALHについて知りたい? ↓ ↓ ↓