每隔一段时间我们就会在 MySQL 中遇到一个运行时间特别长的全文查询。该查询将运行很长时间,目前我看到一个运行了 50,000 秒(并且仍在运行)。在查询上使用 Kill 或 Kill Query 似乎无济于事。另外,客户端的命令Timeout是30秒,所以客户端已经失败并消失了,但是服务器一直在运行查询,占用了相当多的资源。过去,我们必须重新启动 MySQL 服务才能让此类查询停止运行。有没有其他方法可以停止这些查询。我们正在采取措施确保查询不会首先运行,但它们仍会每隔一段时间运行一次,这是一个很大的痛苦。主要是因为当查询正在运行时,我们无法对表执行更新。
一个长时间运行的查询的例子是:
SELECT id,Title From Articles WHERE MATCH(ArticleText) AGAINST('+Nintendo*HD*Wii*' IN BOOLEAN MODE)
由于 * 在搜索字符串的中间以及字符串的末尾,因此运行时间特别长。
最佳答案
您使用的是什么版本的 MySQL?您或许可以通过升级来解决此问题。
此外,该示例查询是真实的吗?我希望搜索字符串类似于“+Nintendo* +HD* +Wii*”,而不是“+NintendoHDWii*。
我在 5.0 中从未遇到过此类问题,但在 MySQL 5.1 的早期版本中,我看到了几个非常相似的问题,这些问题与搜索字符串中的某些内容有关,导致全文查询挂起并且无法终止。
这是我在 5.1.42 中看到的一个,它已在 5.1.45 中修复: http://bugs.mysql.com/bug.php?id=50556 被标记为以下内容的欺骗: http://bugs.mysql.com/bug.php?id=50351
我报告了另一个问题,即当搜索字符串包含冒号时全文查询挂起。该问题在 5.1.31 中存在,并在 5.1.37 中得到修复。
关于MySQL全文查询锁表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094031/