【MySQL】文字列(VARCHAR)のインデックスには注意を!

スポンサーリンク

インデックスがうまく使われずにDBのCPU使用率が90%越えになってしまったときの調査で発見しました。(常識みたいですがw)

インデクスを貼っているVARCHAR型のカラムに数字が入っているときにダブルクォートでくくって文字列として指定しないとインデックスが使われません。

yasu
yasu

今回伝えたいことは以上ですw調査結果を書いていきますので、時間のある方はお付き合いください。

インデックスについては以下の記事をご覧下さい。

 

VARCHARカラムのインデクス挙動の調査

以下のテーブルで調査を行います。

インデックスは「title」カラムに貼っています。

MariaDB [test2]> select * from movies;
+----+-----------+-----------------------+-------+---------------------+
| id | title     | content               | stars | created             |
+----+-----------+-----------------------+-------+---------------------+
|  1 | title     | テストコメント        |     1 | 0000-00-00 00:00:00 |
|  2 | 1234      | コメント              |     1 | 2019-06-19 20:29:09 |
|  3 | testtitle | おもしろい            |     1 | 2019-06-23 17:21:52 |
|  4 | TEST0004  | 4                     |     4 | 2019-08-24 21:38:26 |
|  5 | TEST0005  | 5                     |     5 | 2019-08-24 21:38:26 |
|  6 | TEST0006  | 6                     |     6 | 2019-08-24 21:38:26 |
|  7 | TEST0007  | 7                     |     7 | 2019-08-24 21:38:26 |
|  8 | TEST0008  | 8                     |     8 | 2019-08-24 21:38:26 |
|  9 | TEST0009  | 9                     |     9 | 2019-08-24 21:38:26 |
| 10 | TEST0010  | 10                    |    10 | 2019-08-24 21:38:26 |
| 11 | TEST0011  | 11                    |    11 | 2019-08-24 21:38:26 |
| 12 | TEST0012  | 12                    |    12 | 2019-08-24 21:38:26 |
| 13 | TEST0013  | 13                    |    13 | 2019-08-24 21:38:26 |
| 14 | TEST0014  | 14                    |    14 | 2019-08-24 21:38:26 |
+----+-----------+-----------------------+-------+---------------------+
14 rows in set (0.00 sec)

 

条件を数値(ダブルクォートなし)で指定

インデックスが使われいなくて、全件検索となっています。

MariaDB [test2]> explain
    -> SELECT
    -> *
    -> FROM
    ->   test2.movies m
    -> WHERE
    ->  m.title  = 1234
    -> ;
+------+-------------+-------+------+---------------+------+---------+------+------+----------+
| id | select_type | table | type | possible_keys | key | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+
|    1 | SIMPLE   | m     | ALL  | index_title   | NULL | NULL    | NULL |   14 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+----------+
1 row in set (0.00 sec)
 

条件を文字列(ダブルクォートあり)で指定

インデックスが使われているのがわかりますね。

 
MariaDB [test2]> explain
    -> SELECT
    -> *
    -> FROM
    ->   test2.movies m
    -> WHERE
    ->  m.title  = '1234'
    -> ;
+------+-------------+-------+------+---------------+-------------+---------+-------+------+---
| id |select_type|table|type|possible_keys|key|key_len | ref   | rows | Extra                 |
+------+-------------+-------+------+---------------+-------------+---------+-------+------+---
|  1 | SIMPLE    | m  | ref|index_title| index_title | 768| const | 1 | Using index condition |
+------+-------------+-------+------+---------------+-------------+---------+-------+------+---
1 row in set (0.00 sec)
 
MariaDB [test2]>
タイトルとURLをコピーしました