我的编程空间,编程开发者的网络收藏夹
学习永远不晚

对mysql语句的性能分析与优化

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

对mysql语句的性能分析与优化

1.使用explain,查看查询计划

2.使用show processlist查看查询过程(处于哪个状态),完整命令如下 mysql -uroot -p -e ‘show processlist \G’ |grep state: |sort|uniq -c|sort -rn 此种方法和方法3类似,应该说方法3更好用。

3.使用show profile。 默认是禁止的,需要使用set profiling = 1开启。执行一些查询后,键入show profiles可以看到前面执行语句的查询时间以很高的精度显示了出来。然后使用show profile for query n就可以看到对应查询语句的查询执行的每个步骤以及其花费的时间。

4.使用慢日志,并用第三方工具pt-query-digest生成分析报告。使用这种分析方法时,很有可能需要更改配置文件,可以设置成如下形式: log_slow_queries = /var/log/mysql/mysql-slow.log#日志的存放目录 long_query_time = 0 //捕获所有的查询 log-queries-not-using-indexes//即使不使用索引也可以被记录

在项目中发现程序执行的时间几乎全部消耗在了数据库的操作上。用pt-query-digest对慢查询日志做出分析报告(实际生产中无法方便的打开和关闭慢查询日志,此时可以通过监听TCP流量即使用tcpdump来模拟),发现update和insert操作占到了所有时间的95%。

于是进一步分析执行的语句。

这条update语句各部分耗时如下:

可以看出时间主要耗费在了query end状态中。

google上得到答案,将mysql的配置文件my.conf里加上一句innodb_flush_log_at_trx_commit = 0。 经过验证,成功解决问题,速度提升非常明显(上面的改动同时对insert操作也起了作用)。 同时留下疑问:query end是什么状态,为什么会用这么久的时间,为什么加上innodb_flush_log_at_trx_commit = 0后性能提升会这么大?

query end是什么状态? mysql的官方文档解释是:This state occurs after processing a query but before the freeing items state.我的理解是语句执行完毕了,但是还有一些后续工作没做完时的状态。

那么freeing items 又是什么状态呢? The thread has executed a command. Some freeing of items done during this state involves the query cache. This state is usually followed by cleaning up.就是释放查询缓存里面的空间(因为是update操作,所以相应的缓存里的记录就无效了,所以需要有这一步做处理)。

innodb_flush_log_at_trx_commit的默认值是1,此时的行为是: the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file。log buffer的作用:允许事务在执行完成之后才将日志(事务需要维护一个日志)写到磁盘上,时间主要应该就是耗费在磁盘IO上?

而将innodb_flush_log_at_trx_commit的值改为0后,行为如下: If the value of innodb_flush_log_at_trx_commit is 0, the log buffer is written out to the log file once per second and the flush to disk operation is performed on the log file, but nothing is done at a transaction commit。 可以看到,改成0后,本来应该每次提交都进行的操作,变成了每秒钟才进行一次,所以及大的节省了时间。

将innodb_flush_log_at_trx_commit的值设置为0有一个副作用:任何服务器端mysql程序的崩溃会导致最后一秒的事务丢失(还没来得及到到日志文件中)。但是考虑到本应用对事务不必有如此严格的要求,所以这是可以接受的。

 

来自:http://inetkiller.github.io/2014/05/20/mysql语句性能分析与优化/

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

对mysql语句的性能分析与优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

对mysql语句的性能分析与优化

1.使用explain,查看查询计划2.使用show processlist查看查询过程(处于哪个状态),完整命令如下 mysql -uroot -p -e ‘show processlist \G’ |grep state: |sort|
2022-05-25

PHP与MySQL索引的查询语句优化和索引返回的性能优化策略及其对性能的影响

数据库是现代应用开发中不可或缺的一部分,而针对数据库的查询语句优化和索引返回的性能优化是开发人员应该重点关注的问题。索引是一种用于提高数据库查询效率的重要数据结构,它通过在表中创建特定字段的索引来加速数据的查找和排序过程。本文将重点讨论PH
2023-10-21

MySQL SSL 连接性能分析与优化建议

MySQL SSL 连接性能分析与优化建议随着网络安全问题的日益凸显,越来越多的应用程序选择使用 SSL 加密技术来保护数据传输的安全性。在 MySQL 数据库中, SSL 连接也被广泛应用。然而,由于 SSL 连接需要进行加密与解密操作,
2023-10-22

MyBatis中怎么对SQL语句进行性能分析和调优

MyBatis中可以通过配置日志打印器来对SQL语句进行性能分析和调优。可以使用Log4j、Log4j2、Logback等日志框架来输出MyBatis执行的SQL语句及执行时间等信息。在MyBatis的配置文件中,可以配置日志打印器的类型
MyBatis中怎么对SQL语句进行性能分析和调优
2024-05-08

PHP 性能优化:性能指标解读与分析

php 性能优化需要关注关键性能指标(kpi),包括请求/秒 (rps)、响应时间、内存使用率、cpu 利用率和错误率。分析这些 kpi 可识别性能瓶颈。实战案例中,rps 低、响应时间长表明 cpu 利用率过高,导致服务器处理请求困难。解
PHP 性能优化:性能指标解读与分析
2024-05-10

JavaScript throw 语句的性能优化技巧

JavaScript throw 语句的使用不当会导致性能问题。本文介绍了优化 throw 语句的技巧,包括错误边界、提前返回和基于类型的错误处理。
JavaScript throw 语句的性能优化技巧
2024-03-01

GaussDB for MySQL性能优化的示例分析

小编给大家分享一下GaussDB for MySQL性能优化的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景我们先来看看MySQL 8.0的事务提交的
2023-06-15

如何优化MySQL数据库中的SQL语句性能?

如何优化MySQL数据库中的SQL语句性能?概述:MySQL是目前最常用的关系型数据库管理系统之一,它的性能影响着许多应用程序的运行效率。在开发和维护MySQL数据库时,优化SQL语句的性能是至关重要的。本文将介绍一些优化MySQL数据库中
如何优化MySQL数据库中的SQL语句性能?
2023-12-17

编程热搜

目录