【问题标题】:MySqlDataReader.Read() "Timeout" when read from a very big table (over 100 million records)MySqlDataReader.Read() 从一个非常大的表(超过 1 亿条记录)读取时“超时”
【发布时间】: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


【解决方案1】:

好的,我终于定位问题了!这是因为我使用了“"ADO.NET Driver for MySQL (Connector/Net) 它是由 MySQL 开发的。并且可能存在一些错误。然后我改用 dotConnect ,问题就消失了。感谢大家的帮助。

【讨论】:

  • 我遇到了完全相同的问题。这是 MySql.NET 连接器中的错误吗?您无需购买更多软件即可使其正常工作。
【解决方案2】:

我已将命令超时设置为更高的值,它解决了问题。

 MySqlCommand mySqlCommand = new MySqlCommand(sql_cmd);
 mySqlCommand.Connection = _connection;
 mySqlCommand.CommandTimeout = 3600;

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2020-11-17
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多