执行SQL响应比较慢,你有哪些排查思路?

简介: 如果面试问你,执行SQL响应慢,你有哪些排查思路和解决方案?这是一位去某里面试的小伙伴跟我分享的面试真题,那今天我给大家来分享一下我的思路。

如果面试问你,执行SQL响应慢,你有哪些排查思路和解决方案?这是一位去某里面试的小伙伴跟我分享的面试真题,那今天我给大家来分享一下我的思路。

1、排查思路

如果执行SQL响应比较慢,我觉得可能有以下4个原因:

ae4f402d84ad4fe9608342050e57e07a.jpg

第1个原因:没有索引或者 导致索引失效。


第2个原因:单表数据量数据过多,导致查询瓶颈


第3个原因:网络原因或者机器负载过高。


第4个原因:热点数据导致单点负载不均衡。


接下来,我针对以上几种情况,分别来聊一聊我的解决方案。

2、解决方案

第1种情况:索引失效或者没有没有索引的情况


首先,可以打开MySQL的慢查询日志,收集一段时间的慢查询日志内容,然后找出耗时最长的SQL语句,对这些SQL语句进行分析。

10ffe0f6af42cca894e4ce706771d90c.jpg

比如可以利用执行计划explain去查看SQL是否有命中索引。如果发现慢查询的SQL没有命中索引,可以尝试去优化这些SQL语句,保证SQL走索引执行。如果SQL结构没有办法优化的话,可以考虑在表上再添加对应的索引。我们在优化SQL或者是添加索引的时候,都需要符合最左匹配原则。


第2种情况:单表数据量数据过多,导致查询瓶颈的情况。即使SQL语句走了索引,表现性能也不会特别好。这个时候我们需要考虑对表进行切分。表切分规则一般分为两种,一种是水平切分,一种是垂直切分。


水平切分的意思是把一张数据行数达到千万级别的大表,按照业务主键切分为多张小表,这些小表可能达到100张甚至1000张。

284ed798613a123f4b6e0f85b2156e7b.jpg

那垂直切分的意思是,将一张单表中的多个列,按照业务逻辑把关联性比较大的列放到同一张表中去。

ebf729eb8f0155dcba57b958f835c67b.jpg

除了这种分表之外,我们还可以分库,

c90150387373add6b3cc62e6e2d57f40.jpg

比如我们已经拆分完1000表,然后,把后缀为0-100的表放到同一个数据库实例中,然后,100-200的表放到另一个数据库实例中,依此类推把1000表存放到10个数据库实例中。这样的话,我们就可以根据业务主键把请求路由到不同数据库实例,从而让每一个数据库实例承担的流量比较小,达到提高数据库性能的目的。


第3种情况:网络原因或者机器负载过高的情况,我们可以进行读写分离.

808589d24a9383b32d98f0e4b8509408.jpg

比如MySQL支持一主多从的分布式部署,我们可以将主库只用来处理写数据的操作,而多个从库只用来处理读操作。在流量比较大的场景中,可以增加从库来提高数据库的负载能力,从而提升数据库的总体性能。


第4种情况:热点数据导致单点负载不均衡的情况

a0bb419061221b262cc21e123370e75e.jpg

这种情况下,除了对数据库本身的调整以外,还可以增加缓存。将查询比较频繁的热点数据预存到缓存当中,比如Redis、MongoDB、ES等,以此来缓解数据的压力,从而提高数据库的响应速度。


以上就是我对执行SQL响应慢的排查思路和解决方案的理解,希望能够帮助到大家。关注我,面试不再难!

3c2047b0ee454886b4e6edf75f6c98c3.gif

相关文章
|
3月前
|
SQL 监控 关系型数据库
常见的SQL优化和排查性能异常秘籍
常见的SQL优化和排查性能异常秘籍
34 1
|
7月前
|
SQL 监控 关系型数据库
腾讯一面:你平时怎么排查并调优慢 SQL 的
腾讯一面:你平时怎么排查并调优慢 SQL 的
|
9月前
|
SQL 安全 JavaScript
跨站脚本攻击 (XSS)和SQL注入漏洞php排查解决方案
跨站脚本攻击 (XSS)和SQL注入漏洞php排查解决方案
123 0
|
9月前
|
SQL 监控 Oracle
MySQL发现sql语句执行很慢排查建议
MySQL发现sql语句执行很慢排查建议
396 0
|
11月前
|
SQL
java202303java学习笔记第四十六天-请求-响应-配置sql提示
java202303java学习笔记第四十六天-请求-响应-配置sql提示
64 0
|
SQL 关系型数据库 MySQL
Mysql慢Sql排查
Mysql慢Sql排查
123 0
|
SQL 安全 网络协议
通过RDS MySQL SQL洞察和审计排查如何丢失数据?
最近遇到多次业务方,反馈数据写入成功,但是需要查询使用时,数据确找不到了,所以需要确认数据什么不见了?
通过RDS MySQL SQL洞察和审计排查如何丢失数据?
|
SQL 存储 监控
FAQ系列 | 监控平均SQL响应时长
FAQ系列 | 监控平均SQL响应时长
178 0
|
SQL Java 数据库连接
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
271 0
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
|
SQL 存储 监控
FAQ系列 | 监控平均SQL响应时长
FAQ系列 | 监控平均SQL响应时长
136 0