造成慢SQL可能的原因
无索引或者索引失效
- 索引失效的情况:https://www.chenmx.net/?p=316
锁等待
- 行锁是基于索引加的锁,如果我们在更新操作时,索引失效,行锁也会升级为表锁。
- 除了锁升级还要注意死锁。
MyISAM最小支持表锁,所以不讨论了。InnoDB最小支持行锁,但也要注意锁升级。当一张表使用大量行锁,会导致失误执行率下降,匆匆而可能造成其它事务长时间锁等待和更多的锁冲突发生,致使性能严重下降,更有可能会将行锁升级为表锁。
不恰当的SQL语句
- 例如
select *操作一般都需要回表,除非where条件是主键。 - 对非索引字段进行排序。
在大数据表中使用<LIMIT M,N>分页查询。
优化案例

思路:利用子查询优化分页查询
select * from order where id > (select id from order order by order_no limit 10000,1) limit 20

优化select案例
MySQL Innodb默认创建主键时会创建主键索引,而主键索引属于聚簇索引,即在存储数据时,索引是基于B+,构成的,而叶子节点存放的是主键值。欢迎大家访问我的个人小站:https://www.chenmx.net