慢查詢日志:
MySQL慢查詢日志記錄下所有執行超過long_query_time時間的SQL語句,幫你找到執行慢的SQL,友善我們對這些SQL進行優化。
慢查詢日志的配置:
預設情況下,mysql沒有啟用慢查詢日志。
[root@rh64 ~]# mysql -u root -p
1
2
3
4
5
6
7
8
9
10
<code>Enter password: </code>
<code>Welcome to the MySQL monitor. Commands end </code><code>with</code> <code>; </code><code>or</code> <code>\g.</code>
<code>Your MySQL connection id is </code><code>1</code>
<code>Server version: </code><code>5.6.</code><code>25</code><code>-73.1</code> <code>Percona Server (GPL), Release </code><code>73.1</code><code>, Revision 07b797f</code>
<code>Copyright (c) </code><code>2009</code><code>-2015</code> <code>Percona LLC </code><code>and</code><code>/</code><code>or</code> <code>its affiliates</code>
<code>Copyright (c) </code><code>2000</code><code>, </code><code>2015</code><code>, Oracle </code><code>and</code><code>/</code><code>or</code> <code>its affiliates. All rights reserved.</code>
<code>Oracle is a registered trademark of Oracle Corporation </code><code>and</code><code>/</code><code>or</code> <code>its</code>
<code>affiliates. Other names may be trademarks of their respective</code>
<code>owners。</code>
<code>Type </code><code>'help;'</code> <code>or</code> <code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to clear the current input statement.</code>
mysql> show variables like '%slow%';
+------------------------------------+------------------------------+
| Variable_name | Value |
| log_slow_admin_statements | OFF |
| log_slow_filter | |
| log_slow_rate_limit | 1 |
| log_slow_rate_type | session |
| log_slow_slave_statements | OFF |
| log_slow_sp_statements | ON |
| log_slow_verbosity | |
| max_slowlog_files | 0 |
| max_slowlog_size | 0 |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_always_write_time | 10.000000 |
| slow_query_log_file | /var/lib/mysql/rh64-slow.log |
| slow_query_log_timestamp_always | OFF |
| slow_query_log_timestamp_precision | second |
| slow_query_log_use_global_control | |
16 rows in set (0.01 sec)
1、可以配置my.cnf檔案,服務啟動時自動配置
[root@rh64 ~]# cat /etc/my.cnf
11
12
13
14
15
16
17
18
19
20
21
22
<code>[mysqld]</code>
<code>datadir=/</code><code>var</code><code>/lib/mysql</code>
<code>socket=/</code><code>var</code><code>/lib/mysql/mysql.sock</code>
<code>user=mysql</code>
<code># Disabling symbolic-links is recommended to prevent assorted security risks</code>
<code>symbolic-links=</code><code>0</code>
<code>innodb_data_file_path=ibdata1:12M;ibdata2:10M:autoextend</code>
<code>sql_mode=STRICT_TRANS_TABLES ,NO_ENGINE_SUBSTITUTION</code>
<code>slow_query_log=</code><code>true</code>
<code>slow_query_log_file = </code><code>"/var/lib/mysql/rh64-slow.log"</code>
<code>long_query_time=</code><code>1</code>
<code>log-queries-</code><code>not</code><code>-using-indexes=</code><code>true</code>
<code>[mysqld_safe]</code>
<code>log-error=/</code><code>var</code><code>/log/mysqld.log</code>
<code>pid-file=/</code><code>var</code><code>/run/mysqld/mysqld.pid</code>
<code>explicit_defaults_for_timestamp=</code><code>true</code>
<code>innodb_buffer_pool_size = 128M</code>
<code>join_buffer_size = 128M</code>
<code>sort_buffer_size = 2M</code>
<code>read_rnd_buffer_size = 2M</code>
重新開機server後,檢視:
<code>+------------------------------------+------------------------------+</code>
<code>| Variable_name | Value |</code>
<code>| log_slow_admin_statements | OFF |</code>
<code>| log_slow_filter | |</code>
<code>| log_slow_rate_limit | </code><code>1</code> <code>|</code>
<code>| log_slow_rate_type | session |</code>
<code>| log_slow_slave_statements | OFF |</code>
<code>| log_slow_sp_statements | ON |</code>
<code>| log_slow_verbosity | |</code>
<code>| max_slowlog_files | </code><code>0</code> <code>|</code>
<code>| max_slowlog_size | </code><code>0</code> <code>|</code>
<code>|</code>
<code> </code><code>slow_launch_time | </code><code>2</code> <code>|</code>
<code>| slow_query_log | ON |</code>
<code>| slow_query_log_always_write_time | </code><code>10.000000</code> <code>|</code>
<code>| slow_query_log_file | /var/lib/mysql/rh64-slow.log |</code>
<code>| slow_query_log_timestamp_always | OFF |</code>
<code>| slow_query_log_timestamp_precision | second |</code>
<code>| slow_query_log_use_global_control | |</code>
<code>16</code> <code>rows in set (</code><code>0.00</code> <code>sec)</code>
2、在系統中配置slow-query-log
mysql> set @@global.slow_query_log = on;
<code>| slow_launch_time | </code><code>2</code> <code>|</code>
<code>| slow_query_log_file | /</code><code>var</code><code>/lib/mysql/rh64-slow.log |</code>
<code>16</code> <code>rows </code><code>in</code> <code>set (</code><code>0.00</code> <code>sec)</code>
3、檢視慢查詢日志資訊
[root@rh64 mysql]# tail rh64-slow.log
23
24
25
26
27
28
29
30
31
32
33
34
35
<code>use prod;</code>
<code>SET timestamp=</code><code>1449476453</code><code>;</code>
<code>insert</code> <code>into</code> <code>emp1 select * </code><code>from</code> <code>emp1;</code>
<code># Time: </code><code>151207</code> <code>16</code><code>:</code><code>21</code><code>:</code><code>11</code>
<code># User@Host: root[root] @ localhost [] Id: </code><code>2</code>
<code># Schema: prod Last_errno: </code><code>0</code> <code>Killed: </code><code>0</code>
<code># Query_time: </code><code>16.748949</code> <code>Lock_time: </code><code>0.000137</code> <code>Rows_sent: </code><code>0</code> <code>Rows_examined: </code><code>1236992</code> <code>Rows_affected: </code><code>618496</code>
<code># Bytes_sent: </code><code>58</code>
<code>SET timestamp=</code><code>1449476471</code><code>;</code>
<code>[root@rh64 mysql]# tail -f rh64-slow.log </code>
<code># Time: </code><code>151207</code> <code>16</code><code>:</code><code>22</code><code>:</code><code>54</code>
<code># Query_time: </code><code>44.036039</code> <code>Lock_time: </code><code>0.000083</code> <code>Rows_sent: </code><code>0</code> <code>Rows_examined: </code><code>2473984</code> <code>Rows_affected: </code><code>1236992</code>
<code># Bytes_sent: </code><code>59</code>
<code>SET timestamp=</code><code>1449476574</code><code>;</code>
<code># Time: </code><code>151207</code> <code>16</code><code>:</code><code>26</code><code>:</code><code>46</code>
<code># Query_time: </code><code>106.674422</code> <code>Lock_time: </code><code>0.000148</code> <code>Rows_sent: </code><code>0</code> <code>Rows_examined: </code><code>4947968</code> <code>Rows_affected: </code><code>2473984</code>
<code>SET timestamp=</code><code>1449476806</code><code>;</code>
記錄沒有使用索引的語句:
mysql> set @@global.log_queries_not_using_indexes=on;
Query OK, 0 rows affected (0.00 sec)
<code>mysql> show variables like </code><code>'%index%'</code><code>;</code>
<code>+----------------------------------------+-------+</code>
<code>| Variable_name | Value |</code>
<code>| eq_range_index_dive_limit | </code><code>10</code> <code>|</code>
<code>| expand_fast_index_creation | OFF |</code>
<code>| innodb_adaptive_hash_index | ON |</code>
<code>| innodb_adaptive_hash_index_partitions | </code><code>1</code> <code>|</code>
<code>| innodb_cmp_per_index_enabled | OFF |</code>
<code>| log_bin_index | |</code>
<code>| log_queries_not_using_indexes | ON |</code>
<code>| log_throttle_queries_not_using_indexes | </code><code>0</code> <code>|</code>
<code>| relay_log_index | |</code>
<code>9</code> <code>rows </code><code>in</code> <code>set (</code><code>0.00</code> <code>sec)</code>
測試:
mysql> select count(*) from emp1 where empno=7788;
+----------+
| count(*) |
| 688128 |
1 row in set (4.03 sec)
<code># Time: </code><code>151207</code> <code>16</code><code>:</code><code>30</code><code>:</code><code>44</code>
<code># Query_time: </code><code>4.025612</code> <code>Lock_time: </code><code>0.000098</code> <code>Rows_sent: </code><code>1</code> <code>Rows_examined: </code><code>4947968</code> <code>Rows_affected: </code><code>0</code>
<code># Bytes_sent: </code><code>68</code>
<code>SET timestamp=</code><code>1449477044</code><code>;</code>
<code>select count(*) </code><code>from</code> <code>emp1 </code><code>where</code> <code>empno=</code><code>7788</code><code>;</code>
4、通過mysqldumpslow工具檢視慢查詢日志
[root@rh64 mysql]# mysqldumpslow
<code>Can</code><code>'t determine basedir from '</code><code>my_print_defaults mysqld' output: --datadir=/</code><code>var</code><code>/lib/mysql</code>
<code>--socket=/</code><code>var</code><code>/lib/mysql/mysql.sock</code>
<code>--user=mysql</code>
<code>--symbolic-links=</code><code>0</code>
<code>--innodb_data_file_path=ibdata1:12M;ibdata2:10M:autoextend</code>
<code>--sql_mode=STRICT_TRANS_TABLES ,NO_ENGINE_SUBSTITUTION</code>
[root@rh64 mysql]# mysqldumpslow --help
<code>Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]</code>
<code>Parse and summarize the MySQL slow query log. Options are</code>
<code> </code><code>--verbose verbose</code>
<code> </code><code>--debug debug</code>
<code> </code><code>--help write </code><code>this</code> <code>text to standard output</code>
<code> </code><code>-v verbose</code>
<code> </code><code>-d debug</code>
<code> </code><code>-s ORDER what to sort by (al, at, ar, c, l, r, t), </code><code>'at'</code> <code>is </code><code>default</code>
<code> </code><code>al: average lock time</code>
<code> </code><code>ar: average rows sent</code>
<code> </code><code>at: average query time</code>
<code> </code><code>c: count</code>
<code> </code><code>l: lock time</code>
<code> </code><code>r: rows sent</code>
<code> </code><code>t: query time </code>
<code> </code><code>-r reverse the sort order (largest last instead of first)</code>
<code> </code><code>-t NUM just show the top n queries</code>
<code> </code><code>-a don</code><code>'t abstract all numbers to N and strings to '</code><code>S'</code>
<code> </code><code>-n NUM </code><code>abstract</code> <code>numbers with at least n digits within names</code>
<code> </code><code>-g PATTERN grep: only consider stmts that include </code><code>this</code> <code>string</code>
<code> </code><code>-h HOSTNAME hostname of db server </code><code>for</code> <code>*-slow.log filename (can be wildcard),</code>
<code> </code><code>default</code> <code>is </code><code>'*'</code><code>, i.e. match all</code>
<code> </code><code>-i NAME name of server instance (</code><code>if</code> <code>using mysql.server startup script)</code>
<code> </code><code>-l don't subtract lock time from total time</code>
[root@rh64 mysql]# mysqldumpslow rh64-slow.log
<code>Reading mysql slow query log </code><code>from</code> <code>rh64-slow.log</code>
<code>Count: </code><code>3</code> <code>Time=</code><code>0.</code><code>00s (0s) Lock=</code><code>0.</code><code>00s (0s) Rows=</code><code>0.0</code> <code>(</code><code>0</code><code>), root[root]@localhost</code>
<code> </code><code># Schema: prod Last_errno: N Killed: N</code>
<code> </code><code># Query_time: N.N Lock_time: N.N Rows_sent: N Rows_examined: N Rows_affected: N</code>
<code> </code><code># Bytes_sent: N</code>
<code> </code><code>SET timestamp=N;</code>
<code> </code><code>insert</code> <code>into</code> <code>emp1 select * </code><code>from</code> <code>emp1</code>
<code>Count: </code><code>1</code> <code>Time=</code><code>0.</code><code>00s (0s) Lock=</code><code>0.</code><code>00s (0s) Rows=</code><code>0.0</code> <code>(</code><code>0</code><code>), root[root]@localhost</code>
<code> </code><code>use prod;</code>
<code> </code><code>select count(*) </code><code>from</code> <code>emp1 </code><code>where</code> <code>empno=N</code>
按照平均鎖定時間進行排序,查找前10名:
[root@rh64 mysql]# mysqldumpslow -s al -n 10 rh64-slow.log
Reading mysql slow query log from rh64-slow.log
Count: 3 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
# Schema: prod Last_errno: N Killed: N
# Query_time: N.N Lock_time: N.N Rows_sent: N Rows_examined: N Rows_affected: N
# Bytes_sent: N
SET timestamp=N;
insert into emp1 select * from emp1
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
use prod;
select count(*) from emp1 where empno=N
本文轉自 客居天涯 51CTO部落格,原文連結:http://blog.51cto.com/tiany/1720789,如需轉載請自行聯系原作者