总结 | 慢 SQL 问题经验总结

一、 致使慢 SQL 的缘由mysql

在遇到慢 SQL 状况时,不能简单的把缘由归结为 SQL 编写问题(虽然这是最多见的因素),实际上致使慢 SQL 有不少因素,甚至包括硬件和 mysql 自己的 bug。根据出现的几率从大到小,罗列以下:sql

  1. SQL编写问题数据库

  2. 服务器

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

  4. 服务器硬件函数

  5. MYSQL BUG工具

 

 

二、 由 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()。

 

三、分析诊断工具

在平常开发工做中,咱们能够作一些工做达到预防慢 SQL 问题,好比在上线前预先用诊断工具对 SQL 进行分析。经常使用的工具备:

  1. mysqldumpslow

  2. mysql profile

  3. mysql explain

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

 

 

四、误操做、程序 bug 时怎么办,解决方案

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

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

相关文章
相关标签/搜索