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より)
- クエリーは管理ステートメントでないか、log_slow_admin_statements が有効になっている必要がある。
- クエリーに少なくとも long_query_time 秒かかっているか、log_queries_not_using_indexes が有効であって、クエリーは行参照にインデックスを使用していない。
- クエリーは少なくとも min_examined_row_limit 行を検査している必要がある。
- クエリーは、log_throttle_queries_not_using_indexes 設定によって抑制されていてはならない。
このクエリって、どのindex使ってるの?
複合インデックスが複数ある場合、EXPLAIN
を実行しないとわかりません。
EXPLAIN SELECT * FROM hoge WHERE foo=1 AND bar=2
indexを張る際の勘所
indexを絞り込むのに重要なのは、cardinary
が多いか少ないか
cardinary
は show index from db;
を打つと見れるが
index効率は、このcardinaryが高い順に並べる程にクエリが早くなる。
PRIMARY Indexは複数張ってもあまり使われない
個別で使われるのはwhereとorderbyで分かれた時のみ
WHERE句に複数のカラムがある場合は、複合インデックスを張らないと使ってくれない。
OR句はインデックスを使わない
レコード数がそれほど多くない(数十、数百くらい)なら、個別に打ったほうが実は速い。