- 浏览: 2547717 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (676)
- linux运维 (157)
- php (65)
- mysql (78)
- nginx (27)
- apche (18)
- framework (6)
- windows (9)
- IDE工具 (23)
- struts2 (7)
- java (13)
- 移动互联网 (14)
- memcache redis (23)
- shell基础/命令/语法 (37)
- shell (50)
- puppet (4)
- C (11)
- python (9)
- 产品经理 (27)
- Sphinx (4)
- svn (12)
- 设计构建 (12)
- 项目管理 (44)
- SEO (1)
- 网站架构 (26)
- 审时度势 (42)
- 网络 (14)
- 激发事业[书&视频] (81)
- 其它 (12)
- 摄影 (8)
- android (21)
最新评论
-
zhongmin2012:
原文的书在哪里
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
renzhengzhi:
你好,请问个问题,从master同步数据到slave的时候,s ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
ibc789:
你好,看了你的文章,我想请教个问题, 我在用 redis的时候 ...
redis 的两种持久化方式及原理 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
目录:
1 慢查询日志 配置
2 查看慢查询日志工具:mysqldumpslow mysqlsla
3. 五种mysql日志分析工具比拼
----------------------------------------------------------------------------------1 慢查询日志
配置
开启慢查询日志 , 配置样例:
/etc/mysql/my.cnf
[mysqld]
log-slow-queries
在 my.cnf 配置文件中增加上述配置项并重启 mysql 服务,这时 mysql 慢查询功能生效。慢查询 日志将写入参数 DATADIR (数据目录:/var/lib/mysql)
指定的路径下,默认文件名是 host_name-slow.log 。
和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。下例中演示了慢查询日志的设置和读取过程。
flush privileges;
( 1 )首先查询一下 long_query_time 的值 。
mysql> show variables like 'long%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 10 |
+-----------------+-------+
1 row in set (0.00 sec)
( 2 )为了方便测试,将修改慢查询时间为 5 秒。
mysql> set long_query_time=1;
Query OK, 0 rows affected (0.02 sec)
以上操作只限于当前有效,关闭服务器得重新设置。下面的方法可直接写入my.cnf
log-slow-queries=/var/lib/mysql/slowquery.log
long_query_time=1
( 3 )依次执行下面两个查询语句。
第一个查询因为查询时间低于 1 秒而不会出现在慢查询日志中:
mysql> select count(*) from `gll_pro_ru`;
+----------+
| count(*) |
+----------+
| 208 |
+----------+
1 row in set (0.00 sec)
第二个查询因为查询时间大于 1 秒而应该出现在慢查询日志中:
mysql> select count(*) from `gll_order_desc`;
mysql> select * from `gll_order_desc`;
+----------+
| count(*) |
+----------+
| 6552961 |
+----------+
1 row in set (11.07 sec)
----------------------------------------------------------------------------------2
查看慢查询日志工具
直接输出
# more localhost-slow.log
# Time: 081026 19:46:34
# User@Host: root[root] @ localhost []
# Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961
select count(*) from t_user;
从上面日志中,可以发现查询时间超过 5 秒的 SQL ,而小于 5 秒的则没有出现在此日志中。
如果慢查询日志中记录内容很多,可以使用 mysqldumpslow 工具( MySQL 客户端安装自带)来对慢查询日志进行分类汇总。下例中对日志文件 mysql_master-slow.log 进行了分类汇总,只显示汇总后摘要结果:
[root@mysql_master mysql_data]# mysqldumpslow slowquery.log
----------------- mysqldumpslow mysql官方提供的慢查询日志 分析工具
@@@@@@需要注意所使用的mysqldumpslow的版本不匹配一致,否则会出现无法显示执行time:
/usr/local/mysql5_5_15/bin/mysqldumpslow -s t -t 5 /data/mysql5_5_15/mysql_3307/slowquery.log
-s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
mysqldumpslow -s t -t 20 host-slow.log #执行时间
mysqldumpslow -s l -t 20 host-slow.log #锁时间
mysqldumpslow -s c -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句
------------------------
Reading mysql slow query log from mysql_master-slow.log
Count: 2 Time=11.00s (22s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@mysql_master
select count(N) from t_user;
对于 SQL 文本完全一致,只是变量不同的语句, mysqldumpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的 SQL 瓶颈。
注意:慢查询日志对于我们发现应用中有性能问题的 SQL 很有帮助,建议正常情况下,打开此日志并经常查看分析。
------------------------开始分析:
mysqldumpslow -s t -t 5 slow.log.20100427 > analyse.txt
打开 analyse.txt,最前面的语句就是你最需要优化的(最需要被优化的语句不是执行次数最多的,也不是执行最慢的,而是执行的总时间最长的,即max(执行次数*每条的执行时间),这种语句是最需要被优化的,而且优化后的效果是最明显的).下面举例说明:
Count: 19083 Time=3.08s (58754s) Lock=0.00s (0s) Rows=1.4 (25871), work[work]@[10.13.14.15]
SELECT _mis_uid, _mis_reqip, _mis_time FROM t_mis_user_ip WHERE _mis_time BETWEEN N AND N
19083表示这条sql语句执行了19083次,平均的执行时间是3.08s,总共的时间是58754s.够慢的吧,看来确实需要优化了. 通过BETWEEN N AND N,可以看到,本来是整数的时间被抽象成了Number.接下来我们去slow.log.20100427中找到真正的sql语句:
借助grep即可: grep --color -i "_mis_time" slow.log.20100427 ,如果结果语句很多,再用grep多过滤几次,就可以找到完全符合上述格式的sql了.
例如我找到了一条:
SELECT _mis_uid, _mis_reqip, _mis_time FROM t_mis_user_ip WHERE _mis_time BETWEEN 1272247251 AND 1272247258;
接下来就开始用explain优化它:
explain SELECT _mis_uid, _mis_reqip, _mis_time FROM t_mis_user_ip WHERE _mis_time BETWEEN 1272247251 AND 1272247258 \G
-------------------------实例输出
[root@localhost mysql]# mysqldumpslow -s c -t 5 mysql_slow_log
Reading mysql slow query log from mysql_slow_log
Count: 576 Time=2.02s (1164s) Lock=0.00s (0s) Rows=19964.1 (11499334), root[root]@localhost
select * from maos_v_video where ct_id in(N,N,N,N,N,N,N,N,N) order by u_time desc
Count: 84 Time=2.23s (187s) Lock=0.00s (0s) Rows=1.0 (84), 2users@localhost
select * from maos_book_ext where b_id = N and chapter = N order by sort desc limit N,N
Count: 34 Time=2.24s (76s) Lock=0.00s (0s) Rows=1041.4 (35409), root[root]@localhost
select * from maos_v_video where ct_id in(N,N,N,N,N,N,N,N,N) and word = 'S' order by u_time desc
[root@localhost mysql]# mysqldumpslow -s r -t 5 mysql_slow_log
Reading mysql slow query log from mysql_slow_log
Count: 576 Time=2.02s (1164s) Lock=0.00s (0s) Rows=19964.1 (11499334), root[root]@localhost
select * from maos_v_video where ct_id in(N,N,N,N,N,N,N,N,N) order by u_time desc
Count: 28 Time=3.11s (87s) Lock=0.00s (0s) Rows=7296.0 (204288), root[root]@localhost
select * from maos_v_video where ct_id in(N,N,N,N,N) order by u_time desc
Count: 18 Time=3.56s (64s) Lock=0.00s (0s) Rows=8744.8 (157406), root[root]@localhost
select * from maos_v_video where ct_id in(N,N,N,N,N,N,N,N,N) and cz_id = N order by u_time desc
-----------------
======================================完整分析
/usr/local/mysql5_5_15/bin/mysqldumpslow -s t -t 5 /data/mysql5_5_15/mysql_3307/slowquery.log
======================= 1
Count: 496197 Time=7.05s (3497360s) Lock=0.00s (165s) Rows=1.0 (496197), replication[replication]@2hosts
SELECT COUNT(*) FROM `order_fail` `t` WHERE sub_draws_id='S' AND user_id=N AND date(order_time) = 'S'
#grep --color -i "SELECT COUNT(\*) FROM \`order_fail\`
" /data/mysql5_5_15/mysql_3307/slowquery.log
mysql> EXPLAIN SELECT COUNT(*) FROM `order_fail` `t` WHERE sub_draws_id='7197' AND user_id=4346 AND DATE(order_time) = '2012-06-28';
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | t | ALL | NULL | NULL | NULL | NULL | 415857 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.00 sec)
====================== 2
Count: 18559 Time=2.45s (45543s) Lock=0.00s (8s) Rows=92.0 (1707428), replication[replication]@2hosts
SELECT l.game_id,l.number,l.odds,m.sum_amount,m.sum_share,m.sum_payment,m.sum_discount,m.reserve_amount,c.status,csc.short_covering_base
FROM cur_stopbuy c
LEFT JOIN latest_odds l ON c.game_id = l.game_id AND c.`number` = l.`number` AND l.ctrl_set_id = N AND l.odds_set = 'S'
LEFT JOIN receive_user m ON m.`game_id` = c.game_id AND m.`number` = c.`number` AND m.user_id = N
LEFT JOIN `config_short_covering` csc ON l.category_id = csc.`category_id` AND csc.user_id = 'S'
mysql> explain SELECT l.game_id,l.number,l.odds,m.sum_amount,m.sum_share,m.sum_payment,m.sum_discount,m.reserve_amount,c.status,csc.short_covering_base FROM cur_stopbuy c LEFT JOIN latest_odds l ON c.game_id = l.game_id AND c.`number` = l.`number` AND l.ctrl_set_id = 0 AND l.odds_set = 'A' LEFT JOIN receive_user m ON m.`game_id` = c.game_id AND m.`number` = c.`number` AND m.user_id = 4323 LEFT JOIN `config_short_covering` csc ON l.category_id = csc.`category_id` AND csc.user_id = '4323';
+----+-------------+-------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
| 1 | SIMPLE | c | ALL | NULL | NULL | NULL | NULL | 92 | |
| 1 | SIMPLE | l | eq_ref | PRIMARY | PRIMARY | 34 | const,ssc_da.c.game_id,ssc_da.c.number,const | 1 | |
| 1 | SIMPLE | m | ref | PRIMARY | PRIMARY | 103 | const,ssc_da.c.game_id,ssc_da.c.number | 1 | |
| 1 | SIMPLE | csc | ref | PRIMARY | PRIMARY | 4 | const | 9 | |
+----+-------------+-------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
4 rows in set (0.00 sec)
====================== 3
Count: 13106 Time=2.85s (37401s) Lock=0.00s (1s) Rows=110.7 (1450960), replication[replication]@2hosts
SELECT game_id,number,category_id,status FROM cur_stopbuy
====================== 4
Count: 4 Time=5475.02s (21900s) Lock=0.00s (0s) Rows=0.0 (0), replication[replication]@[192.168.1.213]
CALL p_auto_truncate_table(N,N,@rs)
----------------- MySQL的日志分析工具mysqlsla 【附下载
】
官方网站:http://hackmysql.com
------安装
perl Makefile.PL
make
make install
-----测试
sudo mysqlsla -lt slow /var/lib/mysql/slowquery.log
或者是 mysqlsla -lt slow /var/lib/mysql/slowquery.log >/tmp/slow.log 保存为文件
ubuntu@ubuntu-desktop:/tmp/mysqlsla-2.03$ sudo mysqlsla -lt slow /var/lib/mysql/slowquery.log
Report for slow logs: /var/lib/mysql/slowquery.log
3 queries total, 3 unique
Sorted by 't_sum'
Grand Totals: Time 46 s, Lock 0 s, Rows sent 369.56k, Rows Examined 731.48k
______________________________________________________________________ 001 ___
Count : 1 (33.33%)
Time : 39 s total, 39 s avg, 39 s to 39 s max (84.78%)
Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
Rows sent : 359.56k avg, 359.56k to 359.56k max (97.29%)
Rows examined : 719.11k avg, 719.11k to 719.11k max (98.31%)
Database : sq_gllutf8
Users :
sq_szczkj@localhost : 100.00% (1) of query, 66.67% (2) of all users
Query abstract:
SELECT * FROM gll_pro_ru WHERE N = N ORDER BY id DESC;
Query sample:
select * from gll_pro_ru WHERE 1 = 1 ORDER BY id DESC;
______________________________________________________________________ 002 ___
Count : 1 (33.33%)
Time : 5 s total, 5 s avg, 5 s to 5 s max (10.87%)
Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
Rows sent : 10.00k avg, 10.00k to 10.00k max (2.71%)
Rows examined : 10.00k avg, 10.00k to 10.00k max (1.37%)
Database :
Users :
sq_szczkj@localhost : 100.00% (1) of query, 66.67% (2) of all users
Query abstract:
SELECT * FROM gll_pro_ru WHERE N = N ORDER BY id DESC LIMIT N,N;
Query sample:
select * from gll_pro_ru WHERE 1 = 1 ORDER BY id DESC limit 0,10000;
______________________________________________________________________ 003 ___
Count : 1 (33.33%)
Time : 2 s total, 2 s avg, 2 s to 2 s max (4.35%)
Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%)
Rows sent : 0 avg, 0 to 0 max (0.00%)
Rows examined : 2.37k avg, 2.37k to 2.37k max (0.32%)
Database :
Users :
debian-sys-maint[debian-sys-maint]@localhost : 100.00% (1) of query, 33.33% (1) of all users
Query abstract:
SELECT COUNT(*) INTO @discard FROM information_schema.columns;
Query sample:
select count(*) into @discard from `information_schema`.`COLUMNS`;
Rows examined, 扫描的行数量.
Rows examined, 扫描的行数量.
http://code.google.com/p/mysql-log-filter/
特色功能除了统计信息外, 还针对输出内容做了排版和格式化, 保证整体输出的简洁. 喜欢简洁报表的朋友, 推荐使用一下.
从整体输出样式来看, 比mysql-log-filter还要简洁. 省去了很多不必要的内容. 对于只想看sql语句及执行次数的用户来说, 比较推荐.
工具/功能 | 一般统计信息 | 高级统计信息 | 脚本 | 优势 |
mysqldumpslow | 支持 | 不支持 | perl | mysql官方自带 |
mysqlsla | 支持 | 支持 | perl | 功能强大,数据报表齐全,定制化能力强. |
mysql-explain-slow-log | 支持 | 不支持 | perl | 无 |
mysql-log-filter | 支持 | 部分支持 | python or php | 不失功能的前提下,保持输出简洁 |
myprofi | 支持 | 不支持 | php | 非常精简 |
- mysqlsla-2.03.tar.gz (32.9 KB)
- 下载次数: 29
发表评论
-
mysql表修复
2015-04-07 10:16 102971.1命令myisamchk(必须停掉mysql服务,或者所操 ... -
Table_locks_immediate
2014-08-25 15:46 3101Table_locks_immediate表示立即释放表锁数 ... -
mysql分区
2014-02-21 10:38 1859mysql自5.1开始支持分区 ... -
InnoDB 引擎独立表空间 innodb_file_per_table
2013-02-25 11:14 1320http://deeplyloving.iteye.com ... -
mysql监测工具tuning-primer.sh
2013-01-21 17:57 2665【转】http://www.dbasky.net ... -
mysql主从日志的定期清理
2013-01-21 16:24 1160[转]http://wangwei007.blog.51 ... -
[转]Mysql报错:Result consisted of more than one row
2013-01-09 16:25 15911Error Code : 1172 Result consi ... -
根据bin log 分析管理员被莫名删除问题
2013-01-04 17:04 1179============== 根据bin log 分析管理 ... -
mysql中select * for update锁表的问题
2013-01-04 14:07 2520先前介绍过SELECT ... FOR UPDATE的用法 ... -
PDO报错:Cannot execute queries while other unbuffered queries are active.
2012-12-12 17:57 11982用 PDOStatement->execute() 执行 ... -
MySQL死锁导致无法查询
2012-12-11 14:51 2573客服反馈后台无法查询,原因大概知道,是因为MySQL的事务 ... -
mysql性能分析:mysql profiling 应用
2012-12-11 10:26 13571)先打开profiling ==> set pro ... -
mysql体系结构和查看当前的数据库请求
2012-12-07 15:00 2897mysql体系结构: 由 ... -
mysql_error:Error starting thread: Resource temporarily unavailable
2012-11-01 17:57 2121121031 18:53:17 InnoDB: Unable ... -
导出bin log时间段脚本datarecover.sh
2012-09-06 13:34 1253修改 _binlogdir='/data/mysql/m ... -
Mysql备份工具xtraback全量和增量测试
2012-08-17 14:58 3873【转载】http://blog.chinaunix.net/s ... -
数据库中的隔离级别和锁机制
2012-08-09 17:55 1592ANSI/ISO SQL92标准定义了 ... -
mysqldump和mysql命令
2012-08-03 13:44 1389========================= mys ... -
【汇总】mysql join
2012-07-18 11:35 1178标准SQL中CROSS JOIN交叉连接(笛卡尔积)和内连接I ... -
mysql cursor游标的使用,实例
2012-07-17 23:09 1826mysql被oracle收购后,从mysql-5.5开始, ...
相关推荐
MySQL慢查询日志(Slow Query Log)是一种用于记录执行时间超过预设阈值(默认为10秒,可通过`long_query_time`参数调整)的SQL语句的日志机制。启用方式有二:一是编辑`my.cnf`配置文件中的`log-slow-queries`参数...
- 可以使用`tail -f /var/log/mysql/slow-query.log`命令实时查看慢查询日志文件的内容。 3. **分析慢查询日志** - **查看慢查询日志**:使用`tail -f /var/log/mysql/slow-query.log`命令。 - **使用`...
为了让慢查询日志永久生效,需要修改MySQL的配置文件`***f`,在`[mysqld]`部分加入慢查询日志相关的配置,例如:`slow_query_log=1`表示开启慢查询日志,`long_query_time=3`设置慢查询阈值为3秒,`log_output=FILE`...
slow_query_log_file = /var/log/mysql/slow_query.log ``` 4. **设置日志文件大小和轮换**:为了避免日志文件无限增长占用过多磁盘空间,可以设置日志文件的最大大小和轮换策略。例如: ```ini expire_logs_...
通过分析慢查询日志,我们可以找到 MySQL 中执行时间最长的 SQL 语句,并对其进行优化,从而提高 MySQL 的性能。 在上面的例子中,我们手动触发了两个慢查询,一个是 11 秒的慢查询,另一个是 20 秒的慢查询。然后...
Mysql 慢查询日志查看是指在 Mysql 数据库中,记录和分析执行时间较长的查询语句,以便优化数据库性能和提高查询效率。慢查询日志查看可以帮助数据库管理员和开发者快速地定位和优化数据库中的性能瓶颈。 一、慢...
- `slow_query_log_file`: 指定慢查询日志文件的路径,例如`mysql-slow.log`。 - `long_query_time`: 设置超过该阈值(秒)的查询才会被记录到慢查询日志中,默认为10秒。注意,该值是以秒为单位,而不是毫秒。 2....
众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题。作为mysql的好搭档,php也有这样的功能。如果你使用php-fpm来管理php的话,你可以通过如下选项开启。 PHP 5.3.3 之前设置...
- `mysqlsla`也是一个常用的慢查询日志分析工具,可以从慢查询日志中提取并分析慢查询。 - 安装方法: ```bash wget http://hackmysql.com/scripts/mysqlsla ``` 3. **Percona Toolkit中的pt-query-digest:**...
mysql-slow-query-log-visualizer 用于慢速 MySQL 查询的慢速查询日志可视化工具。 从分叉 由于这里的 github 页面功能,它是实时的(无需自己下载): ://benkaiser.github.io/mysql-slow-query-log-visualizer/
- `slow_query_log=1`表示开启慢查询日志功能。 - `slow_query_log_file`指定了慢查询日志文件的保存位置。 - `long_query_time=10`定义了执行时间超过10秒(注意单位是秒而非毫秒)的查询才会被记录到慢查询日志...
MySQL的慢查询日志(log-slow-queries)是一项非常实用的功能,它允许数据库管理员监控和优化那些运行时间较长的SQL查询。启用这一特性可以帮助识别和解决数据库性能瓶颈,提升整体应用的响应速度。以下是关于开启慢...
1. **MySQL慢查询日志**:MySQL服务器默认不会开启慢查询日志,需要在配置文件(my.cnf或my.ini)中设置`slow_query_log=1`来开启,并通过`slow_query_log_file`指定日志路径。此外,可以调整`long_query_time`参数...
其中,log-slow-queries 选项指定了慢查询日志的存放位置,long_query_time 选项指定了查询执行时间的阈值(在这里是 2 秒),log-slow-admin-statements 选项将 OPTIMIZE TABLE, ANALYZE TABLE, 以及 ALTER TABLE ...
- 性能调优:通过分析慢查询日志,找到执行效率低下的SQL语句,并进行优化。 - 定位问题:在出现性能瓶颈时,通过查看慢查询日志来确定问题根源。 #### 六、MySQL日志分析工具 为了更高效地利用这些日志文件,...
MySQL的慢查询日志(Slow Query Log)是一个非常重要的功能,它记录了执行时间超过预设阈值的SQL查询,帮助管理员识别并优化性能瓶颈。本文将详细介绍如何正确且安全地清空在线的慢查询日志。 首先,我们查看当前慢...
MySQL的日志系统主要包括二进制日志(Binary Log)、查询日志(Query Log)、慢查询日志(Slow Query Log)和错误日志(Error Log)。这些日志对于监控数据库运行状态、追踪异常、性能优化以及数据恢复都起到关键...
MySQL中的慢查询日志(Slow Query Log)是一个非常重要的监控工具,它可以帮助数据库管理员识别和优化执行速度过慢的SQL查询。慢查询日志记录了那些执行时间超过预设阈值(默认为1秒)的SQL语句。下面将详细解释慢...
3. 慢查询日志(Slow Query Log) 慢查询日志记录了执行时间超过特定阈值的查询语句。这个日志对数据库性能优化非常有帮助,因为我们可以根据这个日志来定位执行缓慢的查询,并对它们进行优化。慢查询日志的配置项...