当前位置:   article > 正文

一条sql执行很慢,是什么原因?_单个sql更新慢是什么原因造成的 根据主键更新的 sql执行器里是微秒级别

单个sql更新慢是什么原因造成的 根据主键更新的 sql执行器里是微秒级别

分两种情况,一种是平常执行块,偶尔很慢;二是一直都很慢。
对于第一种,一般有以下两种原因:
(1) 数据库在刷新脏页(flush)
要往数据库中插入、更新一条数据时,数据库会先在内存中将这一条数据更新吗,但却不会立即持久化到磁盘中,而是把这些记录写入到redo log中,等到空闲的时候,再从redo log中把数据同步到磁盘中去。
redo写满了:redo log的容量是有限的,当数据库一直很忙,更新又比较频繁,此时redo log很快被写满,数据库就只能先暂停其他操作,全身心将数据同步到磁盘中去,正因为这样,这个时候执行sql查询就可能很慢。
内存不够了:另外,当一次性查询的数据太多,又恰好碰到所查询的数据也不在内存中,需要申请内存,而此时恰好内存不足,就需要淘汰一部分内存数据页,如果是干净页,就直接释放,如果是脏页,就需要刷新。
(2)拿不到锁
当我们要执行的这条语句,它涉及到的表或行,刚好别人在用,且加了锁,那我们拿不到锁就只能慢慢等别人释放锁了。可以执行show processlist来查看当前的状态。
对于第二种情况,一直都很慢,可能和索引有关
(1)没有用到索引
这种情况又要细分:
a 字段没有建索引
b 字段有索引,但是没有用上
比如说select * from table_A a where a.no+1=100# 就算在no列建立了索引,但是对左边做了运算,会导致索引失效
c 函数操作导致索引失效
比如说一个字段name,你对它用了str()或一些其他函数,也会导致索引失效
(2)数据库选错索引
就算某个字段例如name建立了索引,但系统也会去评估按照索引搜索快还是全表扫描快,而它判断的依据是什么呢?采用取样的方式,来估计数据量,所以,如果样品数据不能代表整体数据,就会导致偏差,数据库就会误判。这种情况下可以强制使用索引,例如select * from table_A a force index(ind) where 10< a.no and a.no<10000;

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1006664
推荐阅读
相关标签
  

闽ICP备14008679号