我的密码

SELECT * FROM andmed3 INNER JOIN test ON andmed3.isik like concat('%', test.isik, '%')


在andmed3中,我有13万行,而在测试中,我有1万行,它不会运行。
当我将其限制为0,500时,它将查询2-3分钟。

怎么会更好呢?

andmed3表

id   name   number   isik   link   stat   else
-----------------------------------------------
1   john    15     1233213  none    11     5
                   8455666
                   7884555


测试台

id    isik
-----------
45    8455666


所以我需要来自andmed3的所有行,其中是测试中出现的数字

最佳答案

问题在于,引擎问题需要为联接中的每一对行设置LIKE表达式(130.000 X 10.000)。
在这种情况下,索引也是无用的,因为需要对表达式进行求值才能完成连接(并且您不能将表达式放在索引内)

可能是您的体系结构/架构存在问题。如果没有人预料到需要基于字符串表达式连接两个表。

可能的解决方案:

(这是一个疯狂的猜测)

从您的示例很难确定,但是如果andmed3.isik包含要在连接中使用的所有可能值,则可以尝试将其放在另一个表中,如下所示:

Andmed3Id    isik
--------- -------
        1 1233213
        1 8455666
        1 7884555


当然,要填充该表,您需要一个策略,可能的策略是:在插入/更新中,在某个小时的后期中进行批量处理。

如果适合,您只需要在查询中再添加一个联接即可。

09-27 14:58