一 ,分两种情况讨论

1,之前执行正常 ,突然就慢了

2,一直就很慢

二,分析原因

之前正常执行突然慢了,可能有以下两种情况:遇到锁了 请求的资源正好被其他的事务加锁了 所以在等锁释放的过程导致执行慢

数据库在刷新脏页:mysql为了提高写的性能 会将修改的操作写入到内存中,当插入一条新数据或者更新数据 会在内存中将对应的字段修改,更新完之后 不是立刻同步持久化到磁盘上的。而是把这些数据写入到redolog 中 也就是说 执行了一个更新操作 将redolog buffer 写入到redo log file 在更新完内存和写完redolog 之后便通知客户端操作成功

一直就很慢,可能有以下两种情况:没有用上索引

字段没有索引 :字段上有索引,但由于自己的疏忽,没有使用索引

函数操作导致没有用上索引

系统有可能走全表扫描而不走索引

结论:由于某些原因,导致系统没有走索引,而是走了全表扫描,而这也是导致我们 SQL 语句执行的很慢的原因。

针对SQL语句的优化

1、查询语句中尽量不要使用 *

2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代

3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代

4、or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)

5、合理的增加冗余的字段(减少表的联接查询)

6、增加中间表进行优化(这个主要是在统计报表的场景,后台开定时任务将数据先统计好,尽量不要在查询的时候去统计)

7、建表的时候能使用数字类型的字段就使用数字类型(type,status...),数字类型的字段作为条件查询比字符串的快

8、那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最末尾