我想了解 MySqlDataReader(或一般的 IDataReader)的怪癖。在互联网上进行研究时,我发现了很多关于如何使用 MySqlDataReader 的资源,但对幕后发生的事情却知之甚少。我之所以这么问,是因为我发现在某些基准测试中,我执行执行所需的时间MySqlCommand.ExecuteReader()
比读取所有数据集要小几个数量级MySqlDataReader.Reader()
。这尤其适用于大型数据集。举个例子:我正在读取 ~740000 行,执行查询需要 80-100 毫秒,读取所有数据大约需要 15 秒。另一个示例是读取约 2200 行,查询时间为约 200 毫秒,约 1 秒以读取所有数据。
根据High Performance MySQL检索的数据缓冲在公共连接器(第 3 版,第 212 页)中,我假设这也适用于Connector/Net。我知道在 740000 行的情况下,可能并非所有数据都可以或应该被缓冲,但在第二个示例中应该可以轻松缓冲 2200 行(我要求不超过 5-7 列)。
在不从数据库读取的情况下创建相当数量的数据结构需要 <1 毫秒(使用 System.Diagnostics.Stopwatch 测量),因此这不是瓶颈。我想知道如果数据被缓冲,为什么从阅读器读取需要这么多时间。