C#MySQL超时问题

本文关键字:问题 超时 C#MySQL | 更新日期: 2023-09-27 17:57:43

我运行的一个查询遇到MySQL超时问题。这是一个简单的查询,但即使在MySQL编辑器中也需要5分钟左右才能完成。我希望你们可能知道一个更好的方法来解决这个超时问题。

            string processedCONString = "SERVER=localhost;" +
                                   "DATABASE=discovery;" +
                                   "UID=;" +
                                   "PASSWORD=;"+
                                   "connection timeout=500000";
        MySqlConnection processCON = new MySqlConnection(processedCONString);
        string mySQLCOMMAND = "update "+ siteString+"_discovery "+
            "set processed = b'0' "
            +"WHERE URL not in (select URL from live)";
        MySqlCommand mysqlprocessCmdInsertItem = new MySqlCommand(mySQLCOMMAND, processCON);
        processCON.Open();
        mysqlprocessCmdInsertItem.ExecuteNonQuery();
        processCON.Close();

是的,这里的UID和密码为空,但代码中没有。

此外,随着这个数据库的增长,查询将花费越来越长的时间。

C#MySQL超时问题

尝试对siteString+"_discovery"返回的表中的URL列进行索引。

更新:

还要注意,在where子句和INNER JOIN中指定语句的顺序非常重要。您需要意识到您的语句何时会导致对每一行执行操作,或者是否会提前完成并应用于行。关于这一点,有几个规则已经在网上得到了很好的记录。其他答案在这里提供了一些好的建议。此外,当我在一家大型机构工作时,我总是在我们的dba面前运行SQL脚本,dba会强烈批评我,并抱怨软件开发人员总是破坏他的m***f***数据库。如果你有这样的人,他们通常是一个很大的帮助,因为他们已经记住了所有这些规则,而我们没有。

谷歌:"sql查询最佳实践",你会发现大量信息。这里有一个链接,

http://blog.sqlauthority.com/2009/01/20/sql-server-rules-for-optimizining-any-query-best-practices-for-query-optimization/

Jonathan Henson的答案是一个很好的选择+1。

如果这还不够的话,你可以试着按零件加工。假设您有一个ID,您可以将代码放在cicle中,并在每次迭代中处理1000个(或您找到的适当数量)项。

也许我正在尝试这个sql。。。

"UPDATE " + siteString + "_discovery as d                 " +
"   SET d.processed = b'0'                                " +
" WHERE d.URL IN (SELECT URL from live where URL = d.URL) ";

与其计算子查询中的整个select,不如对其进行筛选,以便在尝试计算父语句中的where条件时不返回每一行。

尽管如此,子查询将为返回的每一行运行,因此我们可能应该完全删除子查询,并由联接来处理这一问题。由于我们只想对我们可以在LIVE表中找到的URL进行此操作,因此加入它们应该是使子查询变平的蛋糕。。。

"UPDATE d                                  " +
"   SET d.processed = b'0'                 " +
"  FROM " + siteString + "_discovery as d  " +
"  JOIN live as l                          " +
"    ON d.URL = l.URL";

这个特定的更新是在SQL Server上测试的,而不是MySql,但你可能必须调整事件的顺序才能转换它,我不能100%确定,有人能确认吗?

如果您对异常感到恼火,那么

    mysqlprocessCmdInsertItem.CommandTimeout=1000;

可能会有所帮助(或者另一个表示超时的大数字)。命令超时30秒默认值(仅用于网络读取计数的时间)。

我知道这个线程很古老,Mohgeroth走在了正确的轨道上,但对于mysql,查询会是这样的。。。

update siteX_discovery
left join live on live.URL = siteX_discovery.URL
set processed = b'0'
where live.URL is null

当然,正如Jonathan所指出的,你需要指数,否则无论你做什么,它都会很慢

就其本身而言,索引在相当长的一段时间内都足够好,但如果表变大,则消除该子查询将产生显著的影响。