SQL慢查询

分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。


1 导致SQL慢查询的原因

在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。

  1. SQL编写问题

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

  3. 服务器硬件

  4. MYSQL BUG


2 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 字段包括在索引当中减少排序,效率会更高。

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

  13. 分页语句 limit 的问题;

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

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

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

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

  18. 慎用 Oder by rand()。

猜你喜欢

转载自blog.csdn.net/quinnnorris/article/details/80990153