服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 通过MySQL慢查询优化MySQL性能的方法讲解

通过MySQL慢查询优化MySQL性能的方法讲解

2019-06-24 10:57CODETC Mysql

今天小编就为大家分享一篇关于通过MySQL慢查询优化MySQL性能的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

随着访问量的上升,MySQL数据库的压力就越大,几乎大部分使用MySQL架构的web应用在数据库上都会出现性能问题,通过mysql慢查询日志跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句。

通过MySQL慢查询优化MySQL性能的方法讲解

慢查询日志我们可以通过my.cnf文件设置开启,下面先来看一下相关参数的意义

log-slow-queries <slow_query_log_file>

存放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 TABLEALTER TABLE等等。

开启慢查询

方法一:在服务器上找到mysql的配置文件my.cnf , 然后再mysqld模块里追加一下内容

log_slow_queries = NO
log-slow-queries = /var/run/mysqld/slow_querys.log 
long_query_time = 3 
log-queries-not-using-indexes 
log-slow-admin-statements

然后重启mysql服务器即可,这是通过一下命令看一下慢查询日志的情况:

tail -f /var/run/mysqld/slow_querys.log

方法二:通过修改myssql的全局变量来处理,这样做的好处是,不用重启mysql服务器,登陆到mysql上执行一下sql脚本即可

set global slow_query_log=ON;

set global long_query_time=3;

然后通过一下命令查看是否成功

mysql> show variables like 'long%';
+-----------------+-----------+
| Variable_name | Value   |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

mysql> show variables like 'slow%';
+---------------------+---------------+
| Variable_name   | Value     |
+---------------------+---------------+
| slow_launch_time  | 2       |
| slow_query_log   | ON      |
| slow_query_log_file | /tmp/slow.log |
+---------------------+---------------+
3 rows in set (0.00 sec)

分析慢查询日志

方法一:通过查看mysql的慢查询日志分析,比如我们可以tail -f slow_query.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 查询检查的行数

方法二:使用mysqldumpslow命令分析,例如

mysqldumpslow -s c -t 10 /tmp/slow-log

这会输出记录次数最多的10条SQL语句,其中:

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

比如

/path/mysqldumpslow -s r -t 10 /tmp/slow-log

得到返回记录集最多的10个查询。

/path/mysqldumpslow -s t -t 10 -g “left join” /tmp/slow-log

得到按照时间排序的前10条里面含有左连接的查询语句。

慢查询日志的不足

虽然记录了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这样的查询也会被记录下来。开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

延伸 · 阅读

精彩推荐
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5442020-06-03
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2972019-06-23
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6412020-03-13
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23