第一步.开启mysql慢查询

方式一:修改配置文件

Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:\Windows 下。

Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下

在 my.ini 增加几行:

[mysqlld] long_query_time=2 #5.0、5.1等版本配置如下选项 log-slow-queries="mysql_slow_query.log" #5.5及以上版本配置如下选项 slow-query-log=On slow_query_log_file="mysql_slow_query.log" log-query-not-using-indexes 

第二句使用来定义慢查询日志的路径(因为是windows,所以不牵涉权限问题)

第三句就是记录下没有使用索引的query

第二步:查看关于慢查询的状态

方式二:通过MySQL数据库开启慢查询

上文的配置需要重启mysql server进程mysqld才会生效。但是很多时候,尤其是产品运营环境,不希望每次修改都需要重新启动mysql服务器,也希望能在某些特定时间记 录。MySQL5.1给我们提供了更为灵活的运行时控制,使得你不必重新启动mysql服务器,也能选择性地记录或者不记录某些slow queries。

MySQL5.1中,提供了全局变量slow_query_logslow_query_log_file可以灵活地控制enable/disable慢查询。同时可以通过long_query_time设置时间

#//启用slow query记录#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变mysql>set global slow_query_log=ON
mysql>set global long_query_time = 3600;mysql>set global log_querise_not_using_indexes = ON;

和MySQL5.0不同,MySQL5.1可以在运行时改变日记行为,将日志记录到数据库表中。只要将mysql全局变量log_output设置为 TABLE即可。MySQL会将日志分别记录到表mysql.gengera_log和mysql.slow_log二张表中。但是,我们推荐将日志记录 在日记文件中。

mysql> show variables like ‘log_output'\GVariable_name: log_outputValue: FILEmysql>set global log_output='table';

虽然记录了slow query能够帮助你优化产品。但是MySQL目前版本,还有几大蹩足的地方。

  • 1.MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.
  • 2.不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。
  • 3.如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

通过microslow-patch补丁可使用更细的时间粒度,和记录所有执行过的sql语句。不过,使用这个补订不得不自己编译MySQL,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…

第二步.验证慢查询是否开启

执行如下SQL语句来查看mysql慢查询的状态

执行结果会把是否开启慢查询、慢查询的秒数、慢查询日志等信息打印在屏幕上。

/*查看慢查询时间 */ show variables like "long_query_time";默认10s /*查看慢查询配置情况 */ show status like "%slow_queries%"; /*查看慢查询日志路径 */  show variables like "%slow%"; 

其实想要执行一次有实际意义的慢查询比较困难,因为在自己测试的时候,就算查询有20万条数据的海量表,也只需要0.几秒。我们可以通过如下语句代替:

SELECT SLEEP(10);

通过如下sql语句,来查看一共执行过几次慢查询:

show global status like '%slow%';
注意:这些日文件在mysql重启的时候才会生成 #记录所有sql语句 log=E:/mysqllog/mysql.log #记录数据库启动关闭信息,以及运行过程中产生的错误信息 log-error=E:/mysqllog/myerror.log # 记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件 log-bin=E:/mysqllog/bin #记录查询慢的sql语句 log-slow-queries=E:/mysqllog/slow.log  #慢查询时间 long_query_time=2 

方式一:通过工具分析

MySQL自带了mysqldumpslow工具用来分析slow query日志,除此之外,还有一些好用的开源工具。比如MyProfi(下载地址:http://sourceforge.net/projects/myprofi/)、mysql-log-filter,当然还有mysqlsla

以下是mysqldumpslow常用参数说明,详细的可应用mysqldumpslow -help查询。

  • -s,是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序(从大到小),ac、at、al、ar表示相应的倒叙。
  • -t,是top n的意思,即为返回前面多少条数据。
  • -g,后边可以写一个正则匹配模式,大小写不敏感。

接下来就是用mysql自带的慢查询工具mysqldumpslow分析了(mysql的bin目录下),我这里的日志文件名字是host-slow.log。

列出记录次数最多的10个sql语句

mysqldumpslow -s c -t 10 host-slow.log

列出返回记录集最多的10个sql语句

mysqldumpslow -s r -t 10 host-slow.log

按照时间返回前10条里面含有左连接的sql语句

mysqldumpslow -s t -t 10 -g "left join" host-slow.log

使用mysqldumpslow命令可以非常明确的得到各种我们需要的查询语句,对MySQL查询语句的监控、分析、优化起到非常大的帮助。

方式二:直接分析mysql慢查询日志

日志部分内容如下:

# Time: 121017 17:38:54 # User@Host: root[root] @ localhost [127.0.0.1] # Query_time: 3.794217 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4194304 SET timestamp=1350466734; select * from wei where text='orange'; # Time: 121017 17:46:22 # User@Host: root[root] @ localhost [127.0.0.1] # Query_time: 3.819219 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 4194304 SET timestamp=1350467182; select * from wei where text='xishizhaohua'; 

问题很明显,解决方式也很明显,建索引了。

mysql> create index text_index on wei(text);  Query OK, 4194304 rows affected (1 min 58.07 sec)  Records: 4194304 Duplicates: 0 Warnings: 0 
mysql> select * from wei where text='orange'; +---------+--------+ | id   | text  | +---------+--------+ | 4103519 | orange | +---------+--------+ 1 row in set (0.33 sec) 
  • *锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间
  • *数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优
  • *备份数据库,I/O变慢
  • *也许同时运行了其它的查询,减少了当前查询

所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。

总结

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. android从服务器下载文件(php+apache+win7+MySql)
  5. JNI 无法确定Bitmap的签名
  6. android webview 中网页数据与js交互
  7. 【有图】android通过jdbc连接mysql(附文件)
  8. Android(安卓)3.0之后开机无法接收系统广播权限原因
  9. Android(安卓)Studio编译报Default interface methods are only

随机推荐

  1. [已解决]mac android studio安装报错java
  2. Android Studio设置apk文件名
  3. android 取消Title 头部标题栏
  4. Android uiautomator dump 命令介绍
  5. oauth点击授权之后,不Callback到指定url
  6. android 车机电话的通讯录联系人搜索实现
  7. Android Phone进程启动过程
  8. [GeoWay]android用于打开各种文件的inten
  9. Android禁止下拉状态栏
  10. Android 电话拨号