>

mysql记录耗时的sql,体系结构

- 编辑:www.bifa688.com -

mysql记录耗时的sql,体系结构

author:skate
time:2012/02/17
 
mysql记录耗时的sql
 
mysql可以把耗时的sql或未使用索引的sql都记录在slow log里,供优化分析使用。
 
1.mysql慢查询日志启用:
 
mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?
 
mysql> show variables like 'log_slow_queries';
------------------ -------
| Variable_name    | Value |
------------------ -------
| log_slow_queries | OFF   |
------------------ -------
1 row in set (0.01 sec)
 
mysql>
 
这说明slow log功能没有启用,要启用需要修改mysql的配置文件,在配置文件"[mysqld]"里添加如下俩参数:
 
long_query_time=1
log-slow-queries=/var/mysql/logs/slow.log
 
说明
long_query_time
此参数表示的是慢查询的度量时间,单位是秒,最小是1,缺省值是10,凡是执行时间超过long_query_time的sql语句都会记录到慢查询日志中
 
log-slow-queries[=file_name]
file_name参数可选,缺省值是host_name-slow.log,如果指定了file_name参数的话,mysql就会把慢查询的日志记录到file_name所设定的文件中,如果file_name提供的是一个相对路径,mysql会把日志记录到mysql的data目录中,这个参数只能在配置文件里添加,无法在命令行里执行。
 
2.将未使用索引查询也记录到slow log中的配置
在mysql的启动配置文件或命令行参数中增加“log_queries_not_using_indexes” 参数就可以把未使用索引查询语句添加到slow log里了。
 
样例如下:
[[email protected] mysqlsla-2.03]# more /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
log_bin=/tmp/mysql/bin-log/mysql-bin.log
log_bin=ON
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
 
 
log_slow_queries=/tmp/127_slow.log
long_query_time=1
log_queries_not_using_indexes
 
.......
 
重启mysql后,检查结果如下:
 
mysql> show variables like 'log_slow_queries';
------------------ -------
| Variable_name    | Value |
------------------ -------
| log_slow_queries | ON    |
------------------ -------
1 row in set (0.00 sec)
 
mysql> show variables like 'long_query_time';
----------------- -------
| Variable_name   | Value |
----------------- -------
| long_query_time | 2     |
----------------- -------
1 row in set (0.00 sec)
 
mysql>
 
 
 
--------end------    

【体系结构】MySQL日志文件--慢查询日志

【转载地址:

time:2012/02/17 mysql记录耗时的sql mysql可以把耗时的sql或未使用索引的sql都记录在slow log里,供优化分析使用。 1.mysql慢查询日志启...

 

查看MySQL是否启用了查看慢SQL的日志文件

顾名思义,慢查询日志中记录的是执行时间较长的 query

(1) 查看慢SQL日志是否启用

   可以设一个阀值、将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中

mysql> show variables like 'log_slow_queries'; 
------------------ -------
| Variable_name    | Value |
------------------ -------
| log_slow_queries | ON    |
------------------ -------
1 row in set (0.00 sec)

   该阀值可以通过参数long_query_time来设置、默认是10秒

(2) 查看执行慢于多少秒的SQL会记录到日志文件中
mysql> show variables like 'long_query_time';
----------------- -------
| Variable_name   | Value |
----------------- -------
| long_query_time | 1     |   
----------------- -------
1 row in set (0.00 sec)

   这里需要一点、对于运行时间正好等于long_query_time的情况、并不会被记录

这里value=1, 表示1秒

   因为、在源代码里是判断大于long_query_time、而非大于等于

 

 

  1. 配置my.ini文件(inux下文件名为my.cnf), 查找到[mysqld]区段,增加日志的配置,如下示例:
    [mysqld]
    log="C:/temp/mysql.log"
    log_slow_queries="C:/temp/mysql_slow.log"
    long_query_time=1
     
    log指示日志文件存放目录;
    log_slow_queries指示记录执行时间长的sql日志目录;
    long_query_time指示多长时间算是执行时间长,单位s。
     
    Linux下这些配置项应该已经存在,只是被注释掉了,可以去掉注释。但直接添加配置项也OK啦。

[plain] 

mysql> show variables like 'log_slow_queries';  

------------------ -------  

| Variable_name    | Value |  

------------------ -------  

| log_slow_queries | ON    |  

------------------ -------  

1 row in set (0.00 sec)  

  

mysql> show variables like 'long_query_time';  

----------------- -----------  

| Variable_name   | Value     |  

----------------- -----------  

| long_query_time | 10.000000 |  

----------------- -----------  

1 row in set (0.00 sec)  

 

   另一个和慢查询日志相关的参数是log_queries_not_using_indexes

   如果运行的SQL没有使用索引、则MySQL同样会将这条语句记录到慢查询日志文件

 

[plain] 

mysql> show variables like 'log_queries_not_using_indexes';  

------------------------------- -------  

| Variable_name                 | Value |  

------------------------------- -------  

| log_queries_not_using_indexes | OFF   |  

------------------------------- -------  

1 row in set (0.00 sec)  

 

 

   在这里、我没有开启、但有点需要提醒、如果在线修改该参数、虽然没有报错、但是不会生效

   

   

   MySQL 还提供了专门用来分析满查询日志的工具程序 mysqldumpslow、用来帮助MySQL DBA解决可能存在的性能问题

   例子、获得 TOP-5 SQL语句:

 

[plain] 

[[email protected] bin]$ ./mysqldumpslow -s al -n 5 /home/mysql/mysql/log/slow.log  

  

Reading mysql slow query log from /home/mysql/mysql/log/slow.log  

Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), [email protected]  

 

 

   更多用法、请咨询 ./mysqldumpslow --help

   

   从5.1.6版本开始,慢查询日志即可以是个文件,也可以保存在数据库中的指定表

   参数log_output指定了慢查询输出的格式、默认为file、你也可以将它设为table

   参数log_output是动态的、并且是全局的、我们能够在线进行变更

 

[plain] 

mysql> show variables like 'log_output';  

--------------- -------  

| Variable_name | Value |  

--------------- -------  

| log_output    | FILE  |  

--------------- -------  

1 row in set (0.00 sec)  

  

mysql> set global log_output='TABLE';  

Query OK, 0 rows affected (0.00 sec)  

  

mysql> show variables like 'log_output';  

--------------- -------  

| Variable_name | Value |  

--------------- -------  

| log_output    | TABLE |  

--------------- -------  

1 row in set (0.00 sec)  

  

mysql> select sleep(15);  

-----------  

| sleep(15) |  

-----------  

|         0 |  

-----------  

1 row in set (15.02 sec)  

  

mysql> select * from mysql.slow_logG;  

*************************** 1. row ***************************  

    start_time: 2013-04-14 01:22:29  

     user_host: root[root] @ localhost []  

    query_time: 00:00:15  

     lock_time: 00:00:00  

     rows_sent: 1  

 rows_examined: 0  

            db: test  

last_insert_id: 0  

     insert_id: 0  

     server_id: 1  

      sql_text: select sleep(15)  

1 row in set (0.00 sec)  

 

   在这个例子里、我设置了睡眠15秒、那么这句SQL就会被记录到slow_log表

   

   需要注意的是,慢查询日志中有可能记录到与用户权限或密码相关的语句,因此慢查询日志文件的保存也要注意安全

顾名思义,慢查询日志中记录的是执行时间较长的 query 可以设一个阀值、将运行时间超过该值的所...

本文由88bifa必发唯一官网发布,转载请注明来源:mysql记录耗时的sql,体系结构