カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQLのチューニング(クエリ実行速度の改善)

MySQLのクエリ実行速度が遅いので調査・改善する機会がありましたので、それについて書いておきたいと思います。

チェックポイントは以下の通りです。

  • 適切なインデックスが貼られているか確認
  • EXPLAINで実際に使用されたインデックスの確認

適切なインデックスが貼られているか確認

まずは適切なインデックスが貼られているかを確認します。
ここをチェックしないと始まらないのでしっかりと確認します。
適切なインデックスが貼られていない場合は追加します。

EXPLAINで実際に使用されたインデックスの確認

インデックスを追加して、それでも実行速度に改善が見られない場合は、そのインデックスが実際に使われているかを調べます。
SQL文の前にEXPLAINを付加して実行します。

EXPLAINは、クエリー実行計画(MySQLがクエリーをどのように実行するかの説明)を取得するために使用されます。

EXPLAIN SELECT ...

表示された結果の内容を抜粋してご説明します。

possible_keys

利用可能なインデックスの一覧(候補)
続きを読む…»

1,019 views

MySQLのNULL安全等価演算子(宇宙船演算子)

今回はMySQLでのNULL安全等価演算子についてご紹介します。
NULL安全等価演算子とは<=>のことで、見た目が宇宙船に似ていることからSpaceship Operator(宇宙船演算子)とも言われます。
※他言語でもあるんですが、返り値が違ったりするのでご注意ください。

まず、値の比較について見ていきます。

11を等価演算子で比較します。

MySQL> SELECT 1 = 1;
+-------+
| 1 = 1 |
+-------+
|     1 |
+-------+

結果は真の1となりました。

次は10を比較してみましょう。

MySQL> SELECT 1 = 0;
+-------+
| 1 = 0 |
+-------+
|     0 |
+-------+

結果は偽の0となりました。

今後は1NULLを比較してみます。

MySQL> SELECT 1 = NULL;
+----------+
| 1 = NULL |
+----------+
|     NULL |
+----------+

結果は偽の0となるかと思いきや、NULLとなりました。

NULL同士を比較するとどうでしょうか。

MySQL> SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

結果はNULLとなりました。

1NULLの場合は0NULL同士の場合は1になって欲しいですよね。
そこで登場するのが、今回のNULL安全等価演算子(宇宙船演算子)です。
それを使うと次のようになります。

1NULLの場合

SELECT 1 <=> NULL;
+------------+
| 1 <=> NULL |
+------------+
|          0 |
+------------+

NULL同士の場合

SELECT NULL <=> NULL;
+---------------+
| NULL <=> NULL |
+---------------+
|             1 |
+---------------+

ということで、まさに欲しい結果が返ってきてくれます。

続いてサンプルデータを用いて、実際の事例をご紹介します。
続きを読む…»

2,192 views

MySQL TRUNCATE関数で小数点以下の値を切り捨てる

MySQLのTRUNCATE関数を使うと小数点以下を指定の桁数で切り捨てることができます。

  • 小数点以下をすべて切り捨て

    SELECT TRUNCATE(32.768, 0);
    

    出力結果は32となります。

  • 小数点以下を2位までとし、3位以下を切り捨て

    SELECT TRUNCATE(32.768, 2);
    

    出力結果は32.76となります。

  • 第2引数に負の値を渡すと、小数点左側を指定した桁数まで0にできます。

    SELECT TRUNCATE(32.768, -1);
    

    出力結果は30となります。

公式リファレンス:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_truncate

1,499 views

MySQLで10進数を2・8・16進数に変換

MySQLで基数変換を行う方法をご紹介します。

2進数に変換

SELECT BIN(500);

出力結果は111110100となります。

8進数に変換

SELECT OCT(500);

出力結果は764となります。

16進数に変換

SELECT HEX(500);

出力結果は1f4となります。

CONV関数

又、CONV関数を使っても変換することが可能です。
先ほどとは逆に2進数から10進数に変換する場合等もこちらを使用します。

書式:CONV(値, 変換元の基数, 変換先の基数)

例)500を10進数から2進数に変換

SELECT CONV(500, 10, 2);

公式リファレンス
BIN関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_bin
OCT関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_oct
HEX関数:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_hex
CONV関数:https://dev.mysql.com/doc/refman/5.6/ja/mathematical-functions.html#function_conv

974 views

MySQL IN句とFIND_IN_SET関数

MySQLの抽出条件の指定方法としてIN句とFIND_IN_SET関数というものがあります。
その具体的な使用方法をご紹介します。

サンプルとしてテーブル「sample」を用意します。

mysql> select * from `sample`;
+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 3  | 宇野   | 3    |
| 4  | 江崎   | 1    |
| 5  | 奥本   | 2    |
+----+--------+------+

IN句

例えば、idが1・2・4のデータを取得したいとき、
IN句を使うとこのように抽出することができます。

SELECT * FROM sample WHERE id IN (1, 2, 4);

結果は以下のようになります。

+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 4  | 江崎   | 1    |
+----+--------+------+

FIND_IN_SET関数

IN句のときと同様にidが1・2・4のデータを取得してみましょう。

SELECT * FROM sample WHERE FIND_IN_SET(id, '1,2,4');

こちらも結果はIN句を使ったときと同じ結果になります。

続きを読む…»

2,804 views