MySQL 在流式传输 ResultSet 时是否使用服务器端预取
Does MySQL use server-side pre-fetching when streaming a ResultSet
MySQL JDBC 连接器定义了两种获取模式:
- 默认一次获取整个结果集
- 流式传输,当 statement fetchSize is set to Integer.MIN_VALUE
根据文档,流式处理将单独获取每一行,一次一个。
使用流式传输时,每一行都是在单独的数据库往返中获取的,这是真的吗?
MySQL服务器是预先预取结果集还是一次一行遍历服务器端游标?
我相信简短的回答是肯定的。我不知道适用于 mysql_use_result
/mysql_store_result
的细微差别,但有几种类型的预取:
底层的InnoDB存储引擎是预读的,所以会提前开始取页。
有些查询确实需要先完全具体化,然后才能一次对它们进行流式处理(想想不使用索引的排序,或者不使用松散索引扫描的分组)。如果发生这种情况,临时 table 将使用 show profiles
功能显示。
最后,在 MySQL 5.6+ 中,可以对存储引擎的检索进行批处理 (BKA)。这可能是您暗示的情况,填充的缓冲区称为 join_buffer_size
.
MySQL JDBC 连接器定义了两种获取模式:
- 默认一次获取整个结果集
- 流式传输,当 statement fetchSize is set to Integer.MIN_VALUE
根据文档,流式处理将单独获取每一行,一次一个。
使用流式传输时,每一行都是在单独的数据库往返中获取的,这是真的吗?
MySQL服务器是预先预取结果集还是一次一行遍历服务器端游标?
我相信简短的回答是肯定的。我不知道适用于 mysql_use_result
/mysql_store_result
的细微差别,但有几种类型的预取:
底层的InnoDB存储引擎是预读的,所以会提前开始取页。
有些查询确实需要先完全具体化,然后才能一次对它们进行流式处理(想想不使用索引的排序,或者不使用松散索引扫描的分组)。如果发生这种情况,临时 table 将使用
show profiles
功能显示。最后,在 MySQL 5.6+ 中,可以对存储引擎的检索进行批处理 (BKA)。这可能是您暗示的情况,填充的缓冲区称为
join_buffer_size
.