【发布时间】:2011-12-30 12:45:32
【问题描述】:
我有一个大表,其中包含大约 1 亿条 MySQL 记录。 我想从中读取所有记录并在我的 C#/.Net 程序中处理它们, 所以我写了一些这样的代码:
string sql = "SELECT * FROM the_table";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//...
}
但是运行3分钟后,出现超时问题。
如果我将 SQL 语句更改为使用“limit”:
string sql = "SELECT * FROM the_table limit 60000000" //60 million
然后它工作正常。 (循环while (rdr.Read()) 耗时约 3.8 分钟)
是不是表太大导致超时?
这是怎么回事,我该如何解决这个问题?
【问题讨论】:
-
你为什么要把 1 亿条记录塞进内存?这违背了拥有数据库的目的,并将整个 sql 基础架构简化为一个愚蠢的存储系统。
-
由于@MarcB 可能更正确,无论如何,如果您从 the_table 中选择 [onefield] 而不是 *? 会发生什么情况,也许 sql 基础架构运行良好,但您的客户端只是内存不足...
-
好吧,实际上我在连接两个表并选择其中的部分数据时遇到了“超时”问题(其中一个表是问题中提到的大表)。然后我发现即使我写了“SELECT * FROM the_table”也会发生“超时”。我想如果我能修好一个,我就可以修另一个。所以我选择了一种简单的方式来问。 @MarcB
-
我确定不是内存不足。 MySqlDataReader 避免创建不必要的对象或制作不必要的数据副本。 @rene
-
如果你在服务器上运行它也会中断吗?
标签: mysql mysqldatareader