慢 SQL 问题经验总结

1、导致慢SQL的原因在遇到慢SQL情况时,不能简单的把原因归结为SQL编写问题(虽然这是最常见的因素),实际上导致慢SQL有很多因素,甚至包括硬件和mysql本身的bug。根据出现的概率从大到小,罗列如下: SQL编写问题 锁 业务实例相互干绕对IO/CPU资源争用 服务器硬件 MYSQLBUG  2、由…

大家好,又见面了,我是你们的朋友全栈君。

1、 导致慢 SQL 的原因

在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。根据出现的概率从大到小,罗列如下:

  1. SQL编写问题

  2. 业务实例相互干绕对 IO/CPU 资源争用

  3. 服务器硬件

  4. MYSQL BUG

 

2、 由 SQL 编写导致的慢 SQL 优化

针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。正如上一节提到的正确的使用索引能加快查询速度,那么我们在编写 SQL 时就需要注意与索引相关的规则:

  1. 字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;

  2. mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;

  3. 不要在字段前面加减运算;

  4. 字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;

  5. like % 在前面用不到索引;

  6. 根据联合索引的第二个及以后的字段单独查询用不到索引;

  7. 不要使用 select *;

  8. 排序请尽量使用升序 ;

  9. or 的查询尽量用 union 代替 (Innodb);

  10. 复合索引高选择性的字段排在前面;

  11. order by / group by 字段包括在索引当中减少排序,效率会更高。

除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:

  1. 尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步;

  2. 分页语句 limit 的问题;

  3. 删除表所有记录请用 truncate,不要用 delete;

  4. 不让 mysql 干多余的事情,如计算;

  5. 输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的 ( 涉及到数据字典解析,请自行查询资料);

  6. 在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;

  7. 慎用 Oder by rand()。

 

3、分析诊断工具

在日常开发工作中,我们可以做一些工作达到预防慢 SQL 问题,比如在上线前预先用诊断工具对 SQL 进行分析。常用的工具有:

  1. mysqldumpslow

  2. mysql profile

  3. mysql explain

具体使用及分析方法在此就不赘述,网上有丰富的资源可以参考。

 

4、误操作、程序 bug 时怎么办,解决方案

提出这个问题显然主要是针对刚开始工作的年轻同行们……实际上误操作和程序 bug 导致数据误删或者混乱的问题并非少见,但是刚入行的开发工作者会比较紧张。一个成熟的企业往往会有完善的数据管理规范和较丰富的数据恢复方案(初创公司除外),会进行数据备份和数据容灾。

当你发现误操作或程序 bug 导致线上数据被误删或误改动时,一定不能慌乱,应及时与 DBA 联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124757.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月4日 上午9:35
下一篇 2022年4月4日 上午9:35


相关推荐

  • 汉明码的原理、生成和检验

    汉明码的原理、生成和检验在计算机运行过程中 由于种种原因导致数据在存储过程中可能出现差错 为了能够及时发现错误并且将错误纠正 通常可以将原数据配成汉明编码 汉明码具有一位纠错能力 设将要进行检测的二进制代码为 n 位 为使其具有纠错能力 需要再加上 k 位的检测位 组成 n k 位的代码 那么 新增加的检测位数 k 应满足 2k n k 1 或 2k 1 n k 代码长度和检测位数的关系 NK

    2026年3月16日
    2
  • Modbus 功能码解析

    Modbus 功能码解析Modbus 协议功能码详细解析

    2026年3月18日
    3
  • HTTP.SYS远程代码执行漏洞(蓝屏洞)「建议收藏」

    HTTP.SYS远程代码执行漏洞(蓝屏洞)「建议收藏」1.简介远程执行代码漏洞存在于HTTP协议堆栈(HTTP.sys)中,当HTTP.sys未正确分析经特殊设计的HTTP请求时会导致此漏洞。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。不过我看了一下这个HTTP.SYS还发生过其他的远程代码执行漏洞,我还是表明它的漏洞编号吧。CVE-2015-1635(MS15-034)而HTTP.SYS是一个位于Win2003和WinXPSP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通

    2022年7月25日
    19
  • php 快递打印设置,京麦工作台打印机设置 快递单连打设置

    php 快递打印设置,京麦工作台打印机设置 快递单连打设置经常有商家连打的时候纸张偏移或者跳纸 出现这种问题的原因有多种 大多数情况是打印机纸张设置的问题 打印机的一般设置可以参见下面的方法 1 进入控制面板 gt 选择设备和打印机 gt 在相应的打印机上右击选择 打印首选项 gt 高级 如选择纸张规格 根据你打印的出库单或者快递单选择相应的纸张 打印质量最好选择长宽都一样的比例 如 180 180 2 进入控制面板 gt 选择设备和打印机 amp g

    2026年3月19日
    2
  • 最新 OpenClaw(龙虾)超详细安装、配置与安全使用指南

    最新 OpenClaw(龙虾)超详细安装、配置与安全使用指南

    2026年3月14日
    3
  • 3. java缓存-线程内缓存guava cache

    3. java缓存-线程内缓存guava cacheguavacache的缓存结构常用的guavacache缓存根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是LocalLoadingCacheextendsLocalManualCacheimplementsLoadingCache<K,V>接口。LocalManualCache…

    2022年10月4日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号