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


相关推荐

  • griddata方法使用插值方法

    griddata方法使用插值方法’linear’Linearinterpolation(default)双线性插值’cubic’Cubicinterpolation双三次插值’natural’Naturalneighborinterpolation 自然邻近插值’nearest’Nearestneighborinterpolation最近邻近插值’v4’MATLAB®4grid

    2022年5月26日
    41
  • MySQL 系列(四)主从复制、备份恢复方案生产环境实战[通俗易懂]

    MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    2022年2月23日
    52
  • 斗鱼主播都在使用的可取回的CSGO开箱子网站推荐!「建议收藏」

    斗鱼主播都在使用的可取回的CSGO开箱子网站推荐!「建议收藏」斗鱼主播都在使用的可取回的CSGO开箱子网站推荐!incsgo能直接取回皮肤的CSGO饰品皮肤开箱网站官方链接:www.incsgo.gg注册登录自动免费获得$1.00美金优惠码:csgogo(充值使用csgogo可增加5%充值金额)支付:微信支付宝状态:直接取回skinsdog狗网CSGO饰品皮肤开箱网站可直接取回官方链接:skinsdog.cc注册登录自动免费获得$0.8美金推广码:csgogo(注册使用送0.8美金)支付:微信支付宝状态:直.

    2022年10月4日
    3
  • 西班牙语dele等级_DELE——西班牙语水平考试

    西班牙语dele等级_DELE——西班牙语水平考试西班牙语的等级考试在我国发展比较晚,自2004年起我国教育部才开始组织。而且国内的西班牙语等级考试的对象仅为在校西班牙语专业的本科生,每年5月左右考试。水平测试相当于英语四级。另外职称外语考试中有西班牙语的考试,外国学生进入公立大学须通过西班牙语国家等级考试和大学入学考试。DELE简介:作为一门外语的西班牙语水平测试:DELE(DiplomasdeEspa?olComoLenguaEx…

    2022年5月30日
    41
  • termux更改镜像源_pycharm自带python

    termux更改镜像源_pycharm自带python方法1在使用pip命令进行安装的时候,传入镜像地址如下#pipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple#pipinstalldjango==1.11.*-ihttps://pypi.tuna.tsinghua.edu.cn/simple可选的镜像地址有豆瓣https://pypi.douban.com/simple阿里云https://mirror…

    2022年8月29日
    3
  • java中的异或运算符_java按位异或

    java中的异或运算符_java按位异或写这篇真的有点难过,这么基础的东西,也忘记了,很怀疑工作的这两年都在干嘛,是不是路走错了。最近开始看一些算法,其中有这么一段@Testpublicvoidtest2(){inta=2;intb=3;a=a^b;b=a^b;a=a^b;System.out…

    2022年10月5日
    2

发表回复

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

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