MySQL 在流式传输 ResultSet 时是否使用服务器端预取

Does MySQL use server-side pre-fetching when streaming a ResultSet

MySQL JDBC 连接器定义了两种获取模式:

根据文档,流式处理将单独获取每一行,一次一个。

  1. 使用流式传输时,每一行都是在单独的数据库往返中获取的,这是真的吗?

  2. MySQL服务器是预先预取结果集还是一次一行遍历服务器端游标?

我相信简短的回答是肯定的。我不知道适用于 mysql_use_result/mysql_store_result 的细微差别,但有几种类型的预取:

  • 底层的InnoDB存储引擎是预读的,所以会提前开始取页。

  • 有些查询确实需要先完全具体化,然后才能一次对它们进行流式处理(想想不使用索引的排序,或者不使用松散索引扫描的分组)。如果发生这种情况,临时 table 将使用 show profiles 功能显示。

  • 最后,在 MySQL 5.6+ 中,可以对存储引擎的检索进行批处理 (BKA)。这可能是您暗示的情况,填充的缓冲区称为 join_buffer_size.