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和密码为空,但代码中没有。
此外,随着这个数据库的增长,查询将花费越来越长的时间。
尝试对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所指出的,你需要指数,否则无论你做什么,它都会很慢
就其本身而言,索引在相当长的一段时间内都足够好,但如果表变大,则消除该子查询将产生显著的影响。