MySQL

MySQLのQueryについて

MySQLのQueryについて

slowqueryはmsecまでいける

  • default
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
  • 0.01秒まで下げてみる set global long_query_time=0.01;
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.001000 |
+-----------------+----------+
1 row in set (0.01 sec)
  • 最低値は確かめていないがここまではいけた・・・けど、こんなにいらない

long_query_time=0.0000000001

indexを使っていないqueryを調べる

  • ONにするだけの簡単設定
mysql> show variables like 'log_queries_not_using_indexes';
+----------------------------------------+------------------------------------------+
| Variable_name                          | Value                                    |
+----------------------------------------+------------------------------------------+
| log_queries_not_using_indexes          | OFF                                      |
+----------------------------------------+------------------------------------------+
9 rows in set (0.00 sec)
mysql> set global log_queries_not_using_indexes=on;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'log_queries_not_using_indexes';
+----------------------------------------+------------------------------------------+
| Variable_name                          | Value                                    |
+----------------------------------------+------------------------------------------+
| log_queries_not_using_indexes          | ON                                       |
+----------------------------------------+------------------------------------------+
9 rows in set (0.00 sec)

出力される条件 (MySQL Referenceより)

  1. クエリーは管理ステートメントでないか、log_slow_admin_statements が有効になっている必要がある。
  2. クエリーに少なくとも long_query_time 秒かかっているか、log_queries_not_using_indexes が有効であって、クエリーは行参照にインデックスを使用していない。
  3. クエリーは少なくとも min_examined_row_limit 行を検査している必要がある。
  4. クエリーは、log_throttle_queries_not_using_indexes 設定によって抑制されていてはならない。

このクエリって、どのindex使ってるの?

複合インデックスが複数ある場合、EXPLAINを実行しないとわかりません。

EXPLAIN SELECT * FROM hoge WHERE foo=1 AND bar=2

indexを張る際の勘所

indexを絞り込むのに重要なのは、cardinaryが多いか少ないか
cardinaryshow index from db;を打つと見れるが
index効率は、このcardinaryが高い順に並べる程にクエリが早くなる。

PRIMARY Indexは複数張ってもあまり使われない

個別で使われるのはwhereとorderbyで分かれた時のみ
WHERE句に複数のカラムがある場合は、複合インデックスを張らないと使ってくれない。

OR句はインデックスを使わない

レコード数がそれほど多くない(数十、数百くらい)なら、個別に打ったほうが実は速い。