gpt4 book ai didi

mysql - 为什么 LIKE '%%' 依赖于无关连接?

转载 作者:行者123 更新时间:2023-11-29 07:52:13 26 4
gpt4 key购买 nike

我有一个巨大的查询,它本身运行得很好。它有很多 join 语句。所以,它的结构如下所示:

SELECT ... FROM mytable t
LEFT OUTER JOIN mytable2 t2 ON t2.attr = t.attr1
LEFT OUTER JOIN mytable3 t3 ON t3.attr = t.attr3
...
LEFT OUTER JOIN mytableN tN ON tN.attr = t.attrN

它只运行一毫秒。但如果我添加 LIKE 语句:

SELECT ... FROM mytable t
LEFT OUTER JOIN mytable2 t2 ON t2.attr = t.attr1
LEFT OUTER JOIN mytable3 t3 ON t3.attr = t.attr3
...
LEFT OUTER JOIN mytableN tN ON tN.attr = t.attrN
WHERE tK.attrP LIKE '%Something%'

那么它几乎永远不会结束。我没能等到最后,不得不手动停止。但同时,如果我像这样重写查询

SELECT ... FROM mytable t
LEFT OUTER JOIN mytablek tK ON tK.attr = t.attr1
WHERE tK.attrP LIKE '%Something%'

然后它又开始像闪电一样运行。这是为什么?我认为,没有逻辑,所有与此字段attrP无关的额外连接都会对查询速度产生一些影响。我想,我知道如何优化这个查询,但我仍然认为,我使用 MySQL 的次数越多,我就越不喜欢它。数百次我为一些没有合理解释的事情而苦苦挣扎。

编辑

好吧,我认为我知道如何优化它 - 以这种方式使用内连接:

SELECT ... FROM mytable t
... bunch of joins
INNER JOIN mytablek tK ON tK.attr = t.attr1 AND tK.attrP LIKE '%Something%'
... bunch of joins

但这没有任何效果。

编辑

嗯,我找到了一个解决方案 - 使用匹配。但不幸的是,这个解决方案并不通用。事实上,当您尝试在子查询返回的字段中搜索时,match against 会引发错误。可怜的mysql

最佳答案

添加 WHERE tK.attrP LIKE '%Something%' 可能会从结果集中删除记录。但我们不知道有多少。也许 1%,也许 99%。

我们甚至不知道如果我们只将 mytable 与 mytableK 连接并使用该子句,有多少百分比的记录会受到影响。是否值得首先连接这些表,并且在据称剩下的记录很少的情况下,其他连接是否仅使用循环来获取其他表的记录?或者我们应该首先在表上使用出色的连接算法来连接所有内容,最后才使用 LIKE 进行过滤?

我们不知道,数据库管理系统也不知道。

但是您注意到 dbms 在纯连接上速度很快,但在应用 LIKE 子句时速度很慢。因此,提示 dbms 先做一件事,然后再做另一件事:

SELECT *
FROM
(
SELECT ... FROM mytable t
LEFT OUTER JOIN mytable2 t2 ON t2.attr = t.attr1
LEFT OUTER JOIN mytable3 t3 ON t3.attr = t.attr3
...
LEFT OUTER JOIN mytableN tN ON tN.attr = t.attrN
)
WHERE tK_attrP LIKE '%Something%';

关于mysql - 为什么 LIKE '%%' 依赖于无关连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26120013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com