暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL连载:你是如何处理慢查询的?

程序员进化 2021-12-03
462

文字:820 阅读:2分钟

“怎么处理MySQL慢查询问题”

这又是一道面试高频题,解题思路比方法更重要

我们可以从问题表象->分析原因->使用工具->解决问题四步来完成。

问题表现

你在生产环境下是否会遇到以下的情况:

1. 突然收到短信提醒,RDS的CPU负载超过阈值

2. I/O负载高导致服务器卡住,甚至主从服务器同步时间延长,客户反馈刚提交的订单看不到记录

3. 新上线的页面加载数据,loading要转很久


分析原因

这三种情况都可能是SQL查询效率低的问题,首先不是查询慢的SQL就是会显示在慢查询日志中,在MySQL中有一个long_query_time的配置,当执行时间超过这个配置,才会进入慢查询日志。

long_query_time默认10秒,在生产环境我们通常会设置在1秒。

使用工具

如果使用阿里云产品,在RDS中提供了慢SQL管理功能,分为慢日志统计和慢日志明细。

如果自建数据库服务也可以使用MySQL官方提供的mysqldumpshow工具直接查看慢日志。

还可以使用第三方工具pt-query-digest 分析慢查询日志。

以上三种工具都会比较清晰的给出慢SQL语句的执行次数、总时间消耗、平均单次执行时间、最大一次时间、最少一次时间。

解决问题

对于执行慢的SQL我们可以

1. 使用explain查询执行计划,确认索引是否正确使用,还记得昨天我们说的那个口诀吗?MySQL连载:哪些情况下索引会失效

2. 查看系统参数,如:

innodb_buffer_pool_size/innode_log_file_size 等调优。

2. 关联表是否太多,是否可以使用冗余字段减少表关联

3. 过于复杂的查询,是否可以在业务层分次查询 。

4. 分析业务场景 ,是否返回了不必要或是多余的字段

5. 单表数据量过大,就要考虑读写分离、单独业务使用单独数据库,分库分表。

对于执行频率高的SQL我们可以:

建议使用缓存,减少数据库查询

下次,我们具体说说如何使用explain来查看执行计划


PS:

如果公司期待你有更优秀的表现分配你一个任务,这个任务不那么容易,而你期待在这个任务完成后,公司对你有一些鼓励,比如涨薪。

虽然这是正常心理,但并不是等价交换,否则就很容易陷入公司是否值得相信的矛盾中。

可能选择相信,并让自己值得信赖,是既真诚又对自己负责的选择。


关注我,带你一起进化!

更多面试资料

文章转载自程序员进化,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论