# 为什么查询速度会慢

在尝试编写快速的查询之前,需要清楚一点,真正重要是 响应时间。如果把 查询 看成是 一个任务,那么 它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务:

  • 要么消除其中一些子任务

  • 要么减少子任务的执行次数

  • 要么让子任务运行得更快

    有时候可能还需要修改一些查询,减少这些查询对系统中运行的其他查询的影响。这种情况下,你是在减少一个查询的资源消耗。

MySQL 在执行查询的时候有哪些子任务,哪些子任务运行的速度很慢?这很难给出完整的列表,如果按照第 3 章介绍的方法对查询进行剖析,就能看到查询所执行的子任务。通常来说,查询的生命周期 大致可以按照顺序来看:

  • 从客户端
  • 到服务器
  • 在服务器上进行解析
  • 生成执行计划
  • 执行
  • 并返回结果给客户端

其中 执行 可以认为是整个生命周期中最重要的阶段,这其中包括了大量为检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。

在完成这些任务的时候,查询需要在不同的地方花费时间,包括:

  • 网络
  • CPU 计算
  • 生成统计信息和执行计划
  • 锁等待(互斥等待)

等等的操作,尤其是向抵触存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU 操作和内存不足时导致的 I/O 操作上消耗时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。

每一个消耗大量时间的查询 案例中,我们都能看到一些 不必要的额外操作、某些操作被额外的 重复了很多次某些操作执行得太慢 等。优化查询的目的就是 减少和消除 这些 操作所花费的时间

再次申明一点,对于一个查询的全部生命周期,上面列得不完整。这里只是想说明:了解查询的生命周期、清楚查询的时间消耗情况对于优化查询有很大的意义。

#