sql执行很慢的时候可以大致分为两种情况:
一、大部分情况下正常,偶尔慢
1.数据库刷新脏页
- redolog写满:更新数据或者插入数据时,会先在内存中将相应的数据更新,并不会立刻持久化到磁盘中去,而是把更新记录存到redolog日志中去,待到空闲时,再通过redolog把最新数据同步到磁盘中去。所以当redolog写满的时候,就不会等到空闲时,而是暂停手中的活,去把数据同步到磁盘中,所以这个时候SQL就会执行的比较慢
- 内存写满:如果一次查询的数据过多,查询的数据页并不在内存中,这时候就需要申请新的内存空间,而如果此时内存已满,就需要淘汰一部分内存数据页,如果是干净页就直接释放,如果是脏页就需要flush
- 数据库认为空闲的时候:这时候系统不忙
- 数据库正常关闭:内存脏页flush到磁盘上
2.无法获取锁
二、数据量不变的情况下,一直都很慢
- 字段没有索引
- 有索引没用
- 索引没用上
- 数据库选错索引:通过区分度判断走索引的话反而扫描的行数很大而且索引要走两边,选择全表扫描