Sql执行平时都很快但是偶尔就会很慢

记录一下在翻看MySQL技术文章的资料,觉得很不错就自己记录一下。大部分来源于网络。

SQL执行变慢的原因

一条Sql执行很慢,那是每次执行都慢还是偶尔慢,简单的总结一下:

一、针对偶尔慢的原因:

  1. 数据库在刷新脏页。
  2. 数据库的自然数连接占满了。
  3. 拿不到锁。

二、针对一直慢的原因

  1. Sql 索引没有用上或者选择错误的索引。
  2. 函数操作导致索引失效。
  3. 表过大,多表多库联合查询。

解释:

1、数据库在刷新脏页

 当我们输入一条新数据的时候,或者要更新一条数据的时候,我们知道数据库会在 内存 中把对应的字段值更新掉。但是更新之后,这些更新的字段并不是同步写入磁盘进行持久化操作,而是记录到redo log 日志里边,等待空闲的时候在写入磁盘,但是如果数据库一直在操作,redo log日志 存贮就达到上限,数据库就会全心把redo log 日志里的内容写入磁盘,而这个操作就导致我们的SQL查询变慢。

2、数据库连接的自然数满

 出现这种错误明显就是 mysql_connect 之后忘记 mysql_close;当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢?正常的mysql_connect 之后调用 mysql_close()关闭连接。但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘mysql_close()

3、拿不到锁

 我们要执行的SQL,碰巧碰到别人也在用此条数据,就只能等待了。判断是否真的在等待锁,可以用

show processlist 命令来查询当前状态。

重要的是一直慢的原因

4、Sql 索引没有用上或者选择错误的索引。

 我们执行一条SQL,当这条SQL所用的where 条件的字段 没有添加索引就会导致数据库扫描全表。选择错误的索引则是因为MySQL会自己选择索引的基数,而选择这个基数的来源则是MySQL会对一些数据进行随机取样,如果碰巧等到MySQL取样的片区区分度很低,基数很小就会导致直接放弃使用索引,从而采取使用走全部扫描了。如果基数越大就查询越有优势。基数:系统是通过索引的区分度来判断的,一个索引上的值越多,意味着出现相同数值的索引越少,意味着索引的区分度越高。我把区分度叫基数。关于使用错误的索引我们可以使用强制使用我们指定的方式来查询 FORCE INDEX (索引名)

Select * from A force index(a) where c < 1000 AND c >10000000

 也可以使用 SHOW INDEX FROM A 来查询索引基数是否和实际吻合,如果不符合的话我们可以从新来统计基数,可以用 ANALYZE TABLE A; 来进行重新统计分析。

5、函数操作导致索引失效

 select * from A where c -1 = 1000;   未使用索引。select * from A where c = 1000 +1;   使用索引。

6、数据太多又是夸表又是夸库的 肯定慢,但是可以优化到可以接受的程度上。

Sql执行平时都很快但是偶尔就会很慢相关推荐

  1. sql between 效率高吗_整个SQL语句的执行效率都靠它了...

    作者:韩锋 优化器是数据库最核心的功能,也是最复杂的一部分.它负责将用户提交的SQL语句根据各种判断标准,制定出最优的执行计划,并交由执行器来最终执行.优化器算法的好坏.能力的强弱,直接决定了语句的执 ...

  2. 做一个项目,平时都用到哪些工具提高效率(上)

    做一个项目,平时都用到哪些工具提高效率(上)  转载 做.NET 相关项目,Visual Studio 2008,SQL Server 2000/2005是标准的配置,但是,除此之外,还可以应用哪些工 ...

  3. 随笔:数据库SQL执行顺序

    2021年11月20日  周六    写于 上海 和平公园 刚刚还小激动了一下,看到消息上有一个关注,赶紧翻看了一下,才发现还是2019年的一位朋友的关注,顿时归于平静.如果有人关注我,我还是愿意写一 ...

  4. Oracle 查看 SQL执行计划

    Oracle 查看 SQL执行计划 SQL性能分析 执行计划可以用来分析SQL的性能 一.查看执行计划的方法 1. 设置autotrace set autotrace off: 此为默认值,即关闭au ...

  5. 一条SQL要28秒 mysql_一条简单的 SQL 执行超过 1000ms,纳尼?

    阅读本文大概需要 2.8 分钟. MySQL 对我说 "Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用 ...

  6. sql server varchar最大长度_来自灵魂的拷问—知道什么是SQL执行计划吗?

    面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧!看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官:. ...

  7. sql 执行顺序_10个简单步骤,完全理解SQL

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一 ...

  8. 一条简单的 SQL 执行超过1000ms,纳尼?

    作者:VipAugus https://juejin.im/post/5ce906a3e51d455a2f2201dc MySQL对我说"Too young, too naive!" ...

  9. MySQL创建索引跳过redo_明明我建了索引,为什么sql执行的还是这么慢?

    原标题:明明我建了索引,为什么sql执行的还是这么慢? 很多同学经常遇到这样一个问题,就是为了避免sql 执行缓慢,提前将各种可能用到的字段都添加上索引,查询的时候尽可能的使用这些字段,避免全表扫描. ...

最新文章

  1. Android 手机卫士--自定义组合控件构件布局结构
  2. 基于 Kubernetes 的微服务项目设计与实现
  3. vue使用webpack创建项目的命令
  4. python 中 numpy 模块的 size,shape, len的用法
  5. Online Learning算法理论与实践
  6. opencv画图_c++
  7. 2019款享域视频_钱都花哪了?单日投放最高2443款,复盘2019年买量最烧钱的100款手游...
  8. POJ 1811 Prime Test
  9. Chrome 52的变化
  10. sdibt 1244类似于拓扑排序
  11. angular Meterial错误 Did you add it to @NgModule.entryComponents
  12. 9款常用的数据可视化工具推荐
  13. 《东周列国志》第八回 立新君华督行赂 败戎兵郑忽辞婚
  14. latex不等于符号
  15. 从看脸到读心:深度理解人的视觉技术走到哪了?
  16. mysql怎么打开db文件_mysql的db文件怎么打开?
  17. 开机黑屏,硬盘灯不亮,没有自检画面,进不去bios
  18. 上周热点回顾(7.4-7.10)
  19. win10删除提示找不到该项目
  20. 分享一个自用的zsh主题

热门文章

  1. 【程序源代码】商城(微信小程序)
  2. GIMP类似于PhotoShop的开源免费软件
  3. 《软件登记测试报告》可以作为软件第三方检测报告使用吗
  4. php输出1到100的质数,怎么用PHP写出1到100的质数
  5. Tkinter-疫苗信息管理系统
  6. 电子制造业如何快速回复客户订单交期?
  7. php preg_match 漏洞,PHP preg_match()函数信息泄露漏洞
  8. MySQL 8.0原理与实战一网打尽,甲骨文数据库专家硬刚5年之作
  9. html图片转换特效,css3图片切换效果
  10. 脑洞 博弈 E. Competitive Seagulls 2017 ACM Arabella Collegiate Programming Contest