写的select查询为什么很慢啊?
查询性能优化
在之前的文章中,我们介绍了如何设计最优的库表结构,如何建立最好的索引,这些对于高性能来说必不可少。但是这些还不够—你还需要设计合理的查询。如果查询写的很糟糕,即使库表结构再合理,索引再合适,也无法实现高性能。
为什么查询速度会慢
我们在想写一个快速的查询之前需要明白一个问题,真正重要的是响应时间。如果把查询看作是一个任务,那么它是由一系列子任务组成,每个子任务都会消耗一定的时间。如果想要优化查询,就需要优化其子任务,要么你就消除其中的一些子任务,要么就减少子任务的执行次数,要么就让子任务运行的更快。
通常来说呀,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上解析,生成执行计划,执行,并返回结果给客户端。其中 执行 可以认为是整个生命周期最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序,分组等。
在完成这些任务的时候,查询需要在不同的地方花费时间,包括网络,CPU计算,生成统计信息和执行计划,锁等待等操作。尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作,CPU操作和内存不足时导致IO操作上消耗时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。
哪些可能影响查询速度的原因
1、没有索引或者没有用到索引(这是查询慢最常见的问题)
2、I/O吞吐量小,形成了瓶颈效应。
3、内存不足
4、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
5、锁或者死锁(这也是查询慢最常见的问题)
6、返回了不必要的行和列
7、查询语句不好,没有优化
- 点赞
- 收藏
- 关注作者
评论(0)