慢 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 备忘录模式实例_iphone语音备忘录无法分享

    备忘录模式实例_iphone语音备忘录无法分享备忘录模式 Motivation动机模式定义实例结构要点总结笔记动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯对象之前处于某个点时的状态.如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节.如何实现对象状态的良好保存与回复?但同时又不会因此而破坏对象的封装性模式定义在不破坏封装性的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态实例朴素class Memento{ stri

    2022年8月11日
    4
  • The type MultipartEntity is deprecated[通俗易懂]

    The type MultipartEntity is deprecated

    2022年1月25日
    55
  • jquery unbind_java主函数

    jquery unbind_java主函数PHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。PHPPHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。注释:由于基于系统时间,通过该函数生成的ID不是最佳的。如需生成绝对唯一的ID,请使用md5()函数(请在字符串函数参考中查找)。echouniqid();?>本例产生32个字符的独…

    2025年8月13日
    2
  • UTF-8编码规则_库德巴码编码规则

    UTF-8编码规则_库德巴码编码规则UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织

    2022年8月4日
    8
  • 阿里的笔试题_阿里测试面试题

    阿里的笔试题_阿里测试面试题http://gointernetgo.com/text/bishi-2015-alibba大家可以去下载哦

    2025年9月3日
    9

发表回复

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

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