1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLのQueryについて

Posted at

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句はインデックスを使わない

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?