MySQL 执行并返回结果

本文将介绍 MySQL 中执行命令、返回结果的具体流程

一、具体流程

  • MySQL 的服务层会调用存储引擎的接口获取行数据

    假设存储引擎为 InnoDB,则 InnoDB 会读取磁盘中的页放入缓冲池中,并在此过程中通过 LRU 机制淘汰数据页,确保缓冲池空间的可用。

    InnoDB 会读取缓冲池中的内存页,并将行数据返回给服务层

  • 如果行数据不符合条件,跳过;

    如果行数据符合条件,放入结果集中

  • 当结果集中的数据达到 net_buffer_length 时,MySQL 会调用网络接口将数据发出,若发送成功,则清空结果集,继续调用存储引擎获取行数据

  • 当遍历结束时,停止动作

二、说明

  • MySQL 服务层的 net_buffer_length 和 InnoDB 的 LRU 机制确保了无论查询多大的数据,服务器的内存都不会被 “撑爆”
  • MySQL 是 “边读变发” 的,因此如果客户端接收数据过慢,MySQL 服务端结果无法发出,执行时间将被延长

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL