优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长),我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow

Query Log记录功能,它能记录执行时间超过了特定时长的查询。分析Slow Query

Log有助于帮我们找到”问题”查询。记录slow queries

首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。

#打开服务

log_slow_queries = ON

当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow

query的。

启用slow query日志

#//将下列配置放到my.cnf中

[mysqld]

log-slow-queries = /var/lib/mysql/slow-queries.log

//新增加的参数

long_query_time = 3

log-queries-not-using-indexes

log-slow-admin-statements

上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE

TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。

log-slow-queries

存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。

long_query_time

如果query

time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始,依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。

log-queries-not-using-indexes

MySQL会将没有使用索引的查询记录到slow

query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。

log-slow-admin-statements

一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。

日志文件

我们可以通过tail -f查看日志文件。

$tail -f /var/lib/mysql/slow-queries.log

# Time: 110107 16:22:11

# User@Host: root[root] @ localhost []

# Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1

Rows_examined: 6261774

SET timestamp=1294388531;

select count(*) from ep_friends;

第一行,SQL查询执行的时间

第二行,执行SQL查询的连接信息

第三行记录了一些我们比较有用的信息

Query_time SQL执行的时间,越长则越慢

Lock_time 在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间

Rows_sent 查询返回的行数

Rows_examined 查询检查的行数

Slow

Query日志,虽然帮助你记录了那些执行过了的SQL语句。但它不是万能的,意义可能没有你想象的那么大。它只告诉了你哪些语句慢,但是为什么慢?具体原因,还是需要你自己去分析,不断的调试。也许,你只需要换一条更有效的sql语句,也许你只需简单地增加一个索引,但也有可能你需要调整你应用程序的设计方案。比如,上面那条语句是很明显,它检查了600多万行数据。不幸的是,并不是每条语句都这么明显。也许还有别的原因,比如:

*锁表了,导致查询处于等态状态。lock_time显示了查询等待锁被翻译的时间

*数据或索引没有被缓存。常见于第一次启动服务器或者服务器没有调优

*备份数据库,I/O变慢

*也许同时运行了其它的查询,减少了当前查询

所以,不要过于紧张日志文件某条记录,而应该理性地审记,找出真正的原因。如果经常出现的slow

query需要特别注意。如果个别出现,则做一些常规检查即可。我们建议,统计并且形成基准报告,进行比较排除,比胡乱瞎撞有用。希望大家不要在这部分过于浪费时间与精力。

线上记录slow query

上文的配置需要重启mysql

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

queries。

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

#//停用slow query记录

#注意:设置了slow_query_log全局变量, log_slow_queries也会隐性地跟着改变

mysql>set global slow_query_log=OFF

不幸运的是,在MySQL5.0并没有提供类似的全局变量来灵活控制,但是我们可以通过将long_query_time设置得足够大来避免记录某些查询语句。比如

mysql>set global long_query_time = 3600;

MySQL5.0, 不关服务的情况下,希望不记录日志的办法是将日志文件成为/dev/null的符号链接(symbolic

link)。注意:你只需要在改变后运行FLUSH

LOGS以确定MYSQL释放当前的日志文件描述符,重新把日志记录到/dev/null

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

mysql> show variables like ‘log_output’\G

Variable_name: log_output

Value: FILE

mysql>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,出于稳定性考滤,我们推荐在开发测试环境,可以打上这个补丁,享受这个补丁带来的便利。在运营环境尽量不要这么做…

MySQL自带了mysqldumpslow工具用来分析slow

query日志,除此之外,还有一些好用的开源工具。比如MyProfi、mysql-log-filter,当然还有mysqlsla

mysql slow query_mysql slow query相关推荐

  1. mysql cache lock_MySQL:query cache lock

    近期发现管理的一些MySQL实例偶发会出现连接数飙高,响应时间增长,负载上升等问题,但是业务又没有任何的波动,经过一定的排查发现是query cache lock导致. 问题表现: 419 State ...

  2. mysql bingip,MySQL报错Ignoring query to other database的真正原因

    大家都知道报这个错的原因是忘了用户名前加-u这个参数造成的,比如是这样登录了MySQL # mysql -root -p (注意看,-root前面没有加u) 登录后,不管你执行什么命令,都会提示Ign ...

  3. mysql slow query_Mysql 开启 Slow 慢查询

    1:登录数据库查看是否已经开启了Slow慢查询: mysql> show variables like 'slow_query%'; 2:开启Mysql slow日志: 默认情况下slow_qu ...

  4. mysql 查看slow query_MySQL慢查询日志(slow log)

    1.基本知识: mysql> show variables like '%slow%'; +---------------------+----------------------------- ...

  5. MySQL General、Slow日志介绍,参数及配置

    MySQL General log MySQL General log是记录mysqld(MySQLserver进程)收到的所有请求的日志,我们可以通过这个命令查看格式: SHOW CREATE TA ...

  6. mysql 5.5 slow log_mysql5.5开启慢日志slowlog的方法(log_slow_queries)_MySQL

    1.MySQL 5.5命令行里面 代码如下: set global log_slow_queries = on; # 开启慢日志 set [session|global] long_query_tim ...

  7. mysql 禁用查询缓存 query cache

    os:centos 6.8 mysql: 5.5.49 MySQL Query Cache 会缓存select 查询,但是在调优sql查询及测试数据库的性能时需要禁用该功能. 查看变量.状态 mysq ...

  8. mysql havequerycache_如何开启MySQL的中的Query Cache缓存

    MySQL Query Cache是mysql中的一个功能,主要是用来缓存和查询相关数据,本文文详细介绍如何开启MySQL中的Query Cache,以及Query Cache中的一些参数. MySQ ...

  9. 易语言 mysql lost connection during query

    问题 在易语言中执行sql语句失败,用取错误文本命令查看一下,发现错误原因是lost connection during query 原因 连接丢失 解决 设置超时时间wait_timeout 打开m ...

最新文章

  1. mysql stop很久_mysql的timeout
  2. 如何使用Spring Security和Basic身份验证保护Jersey REST服务
  3. Java进阶07 嵌套类
  4. 做好7步 迅速成为行业专家
  5. corba的兴衰_代码广播的兴衰
  6. html提交列表编号自动生成目录,解析 Html 自动生成目录 TOC 的相关代码
  7. 最近弄了个新的技术公众号,欢迎大家关注
  8. 在使用 Go 两年之后,我又转回 PHP 了
  9. pytorch图片数据归一化,通常传入transforms.Normalize(mean,std,inplace=False)中的mean和std是如何获取的?
  10. 带通滤波器是什么,它的原理是什么
  11. 服务器硬盘和普通硬盘驱动安装,固态硬盘与硬盘驱动器的区别及怎样选择
  12. 杂项-一张图片和爆破一
  13. 详解python使用金山词霸的翻译功能(调试工具断点的使用)
  14. 如何利用编程思维,提高英语成绩?
  15. php做宿舍门禁管理系统项目首选公司,宿舍人脸识别门禁系统,校园宿舍管理系统...
  16. Linux_第1章 Linux入门
  17. android开发下载安装app提示未安装应用
  18. 被遗忘的SEO基础知识
  19. 本质复杂性 偶然复杂性_结构偶然性(第一部分)
  20. iPhone 8 到底值不值得买?

热门文章

  1. MATLAB中的eig函数
  2. 红帽linux设置自动启动,RedHat开机启动流程
  3. python获取pdf页数_Python读取pdf页面的一部分
  4. 【考】数据库原理与技术 数据查询
  5. 【ZJOI2017】仙人掌
  6. 21个MySQL表设计的经验准则
  7. 全双工通信的 WebSocket
  8. 杰奇1.X-3.X通用极端简系统,php7高效,杰奇系统多模版一库教程
  9. IONIC--如何使用IONIC
  10. qsort 函数的使用