盘点导致sql执行速度慢的几种情况,都是生产环境踩过的坑

Posted 程序员拾山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了盘点导致sql执行速度慢的几种情况,都是生产环境踩过的坑相关的知识,希望对你有一定的参考价值。

当我们遇到慢sql,第一反应可能就是去优化我们的sql语句。一些比较复杂的语句如果执行慢可能还能理解,但是有时一些特别简单的查询也会变得卡顿,“查一行”,也会执行得特别慢。今天,我们盘点一下,都有哪些情况会导致sql执行速度慢。

1,数据库本身压力较大

如果数据库本身的性能压力就比较大,资源比较紧张,CPU占用率或者IO利用率很高,这时会导致所有的语句执行起来都比较慢。这种情况下首先要做的应该是提升服务器的配置,然后观察服务器的性能指标是否平稳。

2,表锁冲突

如果遇到一个简单的查询长时间未返回结果,那么大概率是表被锁住了。一般遇到这种情况,都是通过show processlist命令,查看sql语句的状态。

如图所示,id为8的语句正在等待一个MDL锁,我们可以使用kill命令杀掉这个阻塞线程。

另外还可以通过表sys.schema_table_lock_waits查询阻塞的线程id。

3,行锁冲突

mysql> select * from temp where id =3 for update;

当我们访问id=3这条记录时,使用了for update,表示要对这条语句加锁。但是如果此时已经有另一个事务对这条记录加了锁,并且一直持有不释放锁,那么当前语句就会一直阻塞。

通过上图可以看出,第一个语句不提交事务,第二个语句就一直处于等待阻塞状态。

我们执行show processlist,

可以看出确实有一个线程处于阻塞状态。

锁冲突会导致执行效率降低,进而影响到业务,需要我们重点关注。

4,索引未命中

mysql> select * from t where c=50000 limit 1;

如果字段c上面没有索引,那么就只能走主键id顺序扫描,一直扫描到第50000行才能停下来。

给表数据加索引可以快速提升查询性能,一般来说,因为索引失效导致的慢sql可能是我们平常开发过程中经常遇到的。

5,多表join查询

有了索引,并不代表万事大吉。如果一个比较复杂的sql,需要关联很多表进行查询,即使每张表的索引都可以起到作用,但是由于数据量过多,即使都命中索引,扫描的行数仍然是巨大的。这样sql的执行速度仍然会受到很大影响。

一般来说,超过3个表的join就应该尽量避免,将其拆分为多个查询,使用空间换时间也不失为一个好办法。

总结

总的来说,sql执行速度慢会受到很多种情况的影响,比如表锁,行锁。在实际的业务场景中也许会更复杂,但是处理起来的步骤基本大同小异,只要找到问题的根源,知道如何解决,处理起来就可以做到心中有数,游刃有余。

写文不易,朋友们帮忙点点赞和关注吧,多谢。

DNS解析不生效原因及应对措施大盘点

一般情况下,新建或修改域名解析之后,可能很快就可以生效。但有时也存在一些解析比较慢的情况。解析不生效或生效比较慢的原因很多,除了网络不可用,域名被劫持等因素外,还存在几种比较常见的情况。下面,中科三方为大家简单介绍下DNS不生效的几种原因。

1.查看域名状态是否异常

如果出现域名解析长时间不生效,就需要检查一下域名的状态,可以通过whois工具查看域名当前的状态是否出现了异常。如果域名的状态是clienthoold(暂停解析)或severhold状态,说明域名是被禁止解析的,在这种状态下,即使设置了域名解析,也是无法生效的,域名无法被访问到,需要联系域名注册商取消这个状态。

除此之外,当域名处于以下几种状态时,域名也无法被解析:

Pendingdelete(域名过期,赎回期)

Redemption period(域名过期,赎回期)

Clienthold(域名被冻结)

Serverhold(域名被冻结)

Inactive(未设置 DNS)

如果是域名状态出现了问题,需要及时联系域名注册商查明情况并解决。

另外如果域名没有经过实名认证或者没有备案成功,也是没法被解析的。

2.要确认权威和递归DNS的域名解析是否修改成功。

如果刚修改过域名解析,解析不能及时生效,那么需要检查下权威DNS和递归DNS解析记录是否修改成功。因为在网站访问过程中,直接影响用户端解析生效的是运营商递归服务器,间接影响用户端解析生效的权威DNS服务器。

首先通过“nslookup 要检测的域名”,查看递归服务器结果,然后再“nslookup 要检测的域名 dns服务器地址”,查看权威服务器结果。

如果递归服务器未生效、权威服务器已生效,表明域名解析刚添加不久,全球的递归服务器还没有完全同步,需要等域名配置的TTL值失效后再检测是否生效。如果TTL值过后,再次检测递归服务器仍然未生效,则可能是域名劫持或缓存投毒。如果递归和权威服务器都没有生效,则表明域名解析没有添加成功,需要检查情况并重新添加。

3.修改解析服务器需等缓存时间后全球同步才能生效

如果是修改了解析服务器,则需要等一定的缓存时间,全球的DNS服务器才能同步生效。一般来说,变更了解析服务器,需要等48小时才能生效。在此期间,由于递归服务器的缓存时间不同,可能会出现有的DNS请求新服务器,有的会请求旧的服务器。所以这种情况下,要耐心等待,不得在此期间对DNS解析记录进行修改,以免影响正常的DNS解析。

DNS解析不生效的原因很多,但归根结底不外乎域名状态异常、递归服务器不生效和权威服务器不生效三种情况,所以我们在遇到解析不生效情况时,仔细检查上面三种情况,就能快速定位故障原因,并针对性进行应对。

以上是关于盘点导致sql执行速度慢的几种情况,都是生产环境踩过的坑的主要内容,如果未能解决你的问题,请参考以下文章

导致SQL执行慢的原因

如何解决BI系统性能差响应慢的问题

access 数据库速度 慢的 问题

Oracle中Hint被忽略的几种常见情形

Oracle中Hint被忽略的几种常见情形

Mysql的索引问题汇总