SQL执行慢的问题排查和优化思路

这篇具有很好参考价值的文章主要介绍了SQL执行慢的问题排查和优化思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题发生时间

待补充

2. 怎么发现的

待补充

3. 当时的现象

3.1 现象一

大多数情况下都正常,偶尔很慢。

3.1.1 主要考虑原因

  1. 数据库在刷新脏页,例如redo log写满了需要同步到磁盘。
  2. 或者执行的时候,遇到锁,如表锁、行锁。
  3. 此次执行的SQL语句存在问题,且真实业务数据量大,便会导致速度极慢的问题。

【补充】
脏页:当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
redo log:mysql 设计了 redo log , 具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题。

3.1.2 其他可能原因

  1. 网络不好
  2. 内存不足
  3. I/O吞吐量小
  4. 形成了瓶颈效应,不过一般公司不会出现这种情况,用的设施都很好的

3.2 现象二

这条SQL语句一直执行的很慢。

3.2.1 主要考虑原因

没有用上索引或者索引失效

  1. 例如该字段没有索引
  2. 或者由于对字段进行运算、函数操作导致无法用索引。

4. 具体的指标

5. 排查的方案

从索引、架构、网络、I/O吞吐量、内存、锁、SQL语句等各个方面来分析。

由于涉及范围比较广,如果不能理清思路去逐步分析,便会使得排查效率极低。

为了快速定位,针对这个问题,我们得对系统有个全局监控。

在有了大概方向后,还得结合具体手段去定位慢查询SQL:

  1. 首先数据库中设置SQL慢查询,我们可以修改配置文件,在my.ini增加几行:主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录(slow_query_log)或者直接通过命令行,通过MySQL数据库开启慢查询。
[mysqlId]
// 定义查过多少秒的查询算是慢查询,我这里定义的是2秒
long_query_time = 2
#5.8、5.1等版本配置如下选项
log-slow-queries="mysql_slow_query.log"
#5.5及以上版本配置如下选项
slow-query-log=On
slow_query_log_file="mysql_slow_query.log"
// 记录下没有使用索引的query
log-query-not-using-indexestpspb 16glos dndnorte/t

mysql>set global slow_query_log=ON
mysql>set global long_query_time = 3600;
mysql>set global
log_querise_not_using_indexes=ON;
  1. 然后当出现慢查询时,我们可以去分析’慢查询日志’。我们可以使用’show processlist’命令定位低效率执行SQL,也可以用‘explain’分析SQL的‘执行计划’。

【补充】
使用‘explain’字段,一般会关注哪些字段
其实使用这个我们主要是看有没有使用到索引,索引失效,访问类型等问题。因此,我们大多情况都是看possible_keys、key、key_len(这三个一般套起来分析),还有就是Extra、type(看全表扫描还是索引、还是索引范围扫描)等等。

possible_keys:表示查询可能使用的索引。
key:实际使用的索引。
key_len: 使用索引字段的长度,结合起来看出索引使用情况。

Extra
using index:覆盖索引,不回表,尽量覆盖,可以提高效率。
using filesort:需要额外的排序,不能通过索引得到排序结果,尽量避免这种情况,会使得速度很慢。

6. 排查后的解决方案

索引+SQL语句+数据库结构优化+优化器优化+架构优化+I/O+内存+网络

6.1 索引

需要从建立索引就开始考虑,索引一般建在where和order by,数据基数要大,区分度要高,不要过度索引,在提高速度同时节约内存。

避免索引失效,然后可以尽量覆盖索引,5.6支持索引下推可以使得速度更快。

在写多读少的场景下,可以选择‘普通索引’而不要‘唯一索引’。因为更新时,普通索引可以使用change buffer进行优化,减少磁盘IO,将更新操作记录到change bugger,等查询来了将数据读到内存再进行修改。

6.2 SQL语句

我们有很多优化手段,随便举几个,比如分页查询优化,该方案适用于主键自增的表,可以把Limit查询转换成某个位置的查询。

select * from tb_sku where id>20000 limit 10;

Insert插入语句时,多条插入语句写成一条,同时可以利用主键索引特性让数据有序插入而使效率更高。

当然还有很多关于SQL写法的优化,这里略提。比如还有,注意union和union all的区别,union all好;注意使用DISTINCT,在没有必要时不要用,它同union一样会使查询变慢,注意临时表、视图等等。

6.2.1 数据库结构

可以考虑将字段多的表分解成多个表。有些字段使用频率高,有些低,数据量大时,会由于使用频率低的存在而变慢,可以考虑分开。

而对于经常联合查询的表,可以考虑建立中间表。

6.2.2 架构

在真实业务场景中,数据量大,并发压力大,我们可以考虑分库分表,纵向、横向分割表,减少表的尺寸,还有采用读/写分离(主库写,从库读)集群模式。

当然采用集群,无疑要增加成本,分库分表又要考虑分布式事务、分布式ld、一致性等等问
题,因此有好也有坏,当你采用某种措施之前也得考虑其性价比,最终带来的好处更多还是坏处更多。

6.2.3 其他

除了这些,我们有时也会考虑,把数据、日志、索引放到不同‘I/O’设备上,增加读取速度,‘升级硬件’,'提高网速’等等。不过也不能一味地去追求速度,因为也得考虑成本,所以具体问题需要具体分析。

7. 解决后的指标

待补充

参考资料:
【大厂面试】分析一下SQL执行慢的原因?如何排查,优化思路?文章来源地址https://www.toymoban.com/news/detail-423987.html

到了这里,关于SQL执行慢的问题排查和优化思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server事务执行过程中中释放锁导致的死锁问题 - 排查与分析

    系统的某个用来上报数据的接口存在死锁的问题。这个接口内部对多张表进行了Update操作,执行顺序为A表、B表、C表、D表、A表。死锁发生的SQL,一条是第一次更新A表的SQL,另一条是第二次更新A表的SQL。整个更新都处在一个事务内,理论上讲,只要第一个Session开始执行事务

    2024年02月02日
    浏览(40)
  • Mysql找出执行慢的SQL【慢查询日志使用与分析】

    慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来 explain + 慢SQL分析 show Profile。(比explain还要详细,可以查询SQL在MySQL数据库中的执行细节和生命周期情况) 运维经理 OR DBA,进行MySQL数据库服务

    2024年02月11日
    浏览(36)
  • 【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

    慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来 explain + 慢SQL分析 show Profile。(比explain还要详细,可以查询SQL在MySQL数据库中的执行细节和生命周期情况) 运维经理 OR DBA,进行MySQL数据库服务

    2024年02月13日
    浏览(27)
  • linux主机宕机排查问题方法 1 排查思路

    1.1 查看宕机的时间记录和历史登陆还有重启时间 1)查看历史重启 2)查看历史异常登录用户 1.2 首先查看系统日志 linux下的/var/log/下的log日志,包括message,内核报错日志demsg等等,sa记录,是记录cpu,内存等运行的性能文件,记录着运行时的cpu的运行状态等。 1)利用sa文件

    2024年02月16日
    浏览(28)
  • Linux丢包问题排查思路

    判断问题与网络丢包有关 通过抓tcpdump,通过wireshark提示查看数据包状态。比如客户端重传多次失败,服务端提示丢包等错误,均是可能由于丢包导致的异常。 丢包可能存在的位置 网络丢包在交互过程中的每一个环节都有可能出现。主要环节如下: 两端服务器:主要表现在

    2024年02月15日
    浏览(32)
  • JavaWeb初学项目的问题排查思路

       常说代码cv,遇到具体需求时,解决问题的思路有了才可以cv,特此根据浅薄经验记录思路,反思自己。         需求能不能做,确定好工期。       根据用户的需求设计数据库,这一步极为关键,表关系可以一对多,多对多等,只能根据项目经验去提升,有意识的思考,

    2024年02月09日
    浏览(25)
  • 【记一次线上事故的排查思路】- CPU飙升问题排查

    由于项目排期较紧,临时从其他组调来三个开发资源帮我一起做项目,难免上线的时候大家的需求一块上线。 问题来了,上线三天后,线上CPU总是莫名奇妙的突然飙升,飙升后CPU并未降下来,而是一直处在高点。 由于是线上导致的问题,CPU超限后,会自动重启项目,未能保

    2024年01月23日
    浏览(41)
  • 优化GitHub网站访问慢的问题

    大型网站服务器都不会是只有一台服务器,而是多台服务器组成的集群一起对外提供服务。 使用站长工具测速,找一个速度比较快的服务器。 图中可以看到140.82.121.4这个ip比较快, 下面修改hosts: Mac 在 /etc/hosts 中, Windows 在 C:WindowsSystem32driversetchosts 中。 hosts文件内容如下

    2024年02月12日
    浏览(36)
  • 不要再说你不会了——网络性能问题排查思路

    服务监控系列文章 服务监控系列视频 网络问题往往是性能排查中最复杂的一个问题,因为网络问题往往涉及的链路比较长,排查起来不仅仅是看本地机器的指标就可以了。本文将展示一个比较系统的排查网络问题的思路。 我们往往都是通过类似prometheus,grafana搭建的监控平

    2023年04月13日
    浏览(25)
  • 关于Mysql使用left join写查询语句执行很慢的问题解决

    目录 (一)前言 (二)正文 1. 表结构/索引展示 (1)表结构 (2)各表索引情况 2. 存在性能问题的SQL语句 3. 解决思路 (1)执行计划思路调优 (2)字符集匹配调优 (三)总结 1. 关于执行计划中TYPE的性能比较 2. 关于left join优化 3. 其他注意点 这几天供应商在测试环境上使

    2024年02月02日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包