MySQL 在流式传输 ResultSet 时是不是使用服务器端预取
Posted
技术标签:
【中文标题】MySQL 在流式传输 ResultSet 时是不是使用服务器端预取【英文标题】:Does MySQL use server-side pre-fetching when streaming a ResultSetMySQL 在流式传输 ResultSet 时是否使用服务器端预取 【发布时间】:2016-06-27 19:03:52 【问题描述】:mysql JDBC 连接器定义了两种获取模式:
默认的一次获取整个 ResultSet 流式传输,当statement fetchSize is set to Integer.MIN_VALUE根据文档,流式传输将单独获取每一行,一次一个。
当使用流式传输时,每一行都在单独的数据库往返中获取,这是真的吗?
MySQL 服务器是提前预取结果集还是一次遍历服务器端游标一行?
【问题讨论】:
这不是***.com/questions/35346229/…的复制品吗? 可能是这样,虽然这个问题实际上包含两个问题。 【参考方案1】:我相信简短的回答是肯定的。我不知道适用于mysql_use_result
/mysql_store_result
的细微差别,但有几种类型的预取:
下面的 InnoDB 存储引擎有预读功能,所以会提前开始抓取页面。
某些查询确实需要完全具体化,然后才能一次以流式传输行(想想不使用索引的排序,或不使用松散索引扫描的分组)。如果发生这种情况,临时表将使用show profiles
功能显示。
最后,在 MySQL 5.6+ 中,可以对存储引擎的检索进行批处理 (BKA)。这可能是您暗示的情况,填充的缓冲区称为join_buffer_size
。
【讨论】:
以上是关于MySQL 在流式传输 ResultSet 时是不是使用服务器端预取的主要内容,如果未能解决你的问题,请参考以下文章
Amazon DynamoDB 是不是支持查询结果的流式传输
在 try-with-resources 块之外流式传输 JOOQ 结果时,我是不是会冒 JDBC 连接泄漏的风险?