【发布时间】:2014-10-10 08:09:50
【问题描述】:
我想了解 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 列)。
在不从数据库读取的情况下创建相当数量的数据结构需要
【问题讨论】:
-
相关(SQL-Server):stackoverflow.com/questions/1383920/how-datareader-works
-
“创建可比较数量的数据结构” 不清楚您测量了什么,ToList())。虽然
DataReader分批流式传输行,但它仍然需要执行查询才能开始处理行。如果查询很昂贵,则阅读器必须等到第一行被流式传输。也许您需要添加缺失的索引或以其他方式优化您的查询。
标签: c# mysql mysqldatareader