关于sql:mysql regexp查询挂起,但是mysql进程重启时显示结果 | 珊瑚贝

mysql regexp query hangs, but displays results when mysql process restarts


我有两张桌子。 Table1 是 1000 万行,Table2 是 100 万行。我需要用正则表达式搜索 Table2,然后加入这些表。

当我这样做时:

1
2
3
4
SELECT * FROM table2
LEFT JOIN table1
ON table1.ID1=table2.ID2
WHERE table2.column REGEX ‘regexp’

查询永远不会结束。

但是,当我杀死 mysqld 进程时,它会显示结果(在 PHPMyAdmin 中),显示的执行时间仅为 0.07 秒。

如果我使用 LIKE 代替 REGEXP 没有问题,如果我单独在 table2 上使用 REGEX 也没有问题。

ID1

  • 如果您有一个超过 100 万行的复杂正则表达式,可能需要一段时间。
  • 您不能对表名执行正则表达式;对列名执行此操作(例如 WHERE table2.someColumn REGEX ‘regexp’)
  • 我不认为 regexp 使用索引,即使对于常量字符串也是如此。请改用 like。
  • 执行”desc”以查看查询是否使用任何索引。我认为@SverriM.Olsen 是对的——查询看起来有点可疑。
  • @juergend 这不是问题,正如我所说,table2 上的正则表达式单独工作正常。
  • @GordonLinoff:是的,我知道,我索引了 ID。我知道正则表达式需要时间,但同样,仅在 table2 上它运行正常。在这种情况下我不能使用 like 。
  • @SverriM.Olsen:抱歉,忘记添加列名!
  • @ethrbunny:正如我所说,我这样做了,它使用了 ID 的索引。该列还具有唯一索引和全文索引,但这不是问题。
  • 对我之前评论的更正:我不知道是否可以对表名执行 REGEX ,但这确实看起来很奇怪。
  • @SverriM.Olsen:再次抱歉,我的错,这不是我想做的,我的问题中的错字,而不是我的实际查询


原来整个问题是两个表中的 ID 字段属于不同的类型(mediumint 与 int)。一旦我将它们都更改为 int,查询速度很快。
由于引擎是 MyISAM,因此我无法使用可能会让我更快意识到问题的外键。


来源:https://www.codenong.com/20832125/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?