在 MYSQL 中的两个不同表中使用 like 比较两列的最快方法,五十万行

问题描述 投票:0回答:1

我有一个 MYSQL 数据库,其中有一个表“product”,大约有 500 000 行,有一列“oem”(varchar 255,utf8_unicode_ci)。我还有另一个表“oem”,也有一个列“oem”(varchar 255,utf8_unicode_ci),大约 150 000 行。

我需要从表“product”中搜索所有产品,其中product.oem包含表“oem”中的oem。

示例:

产品 1 OEM:ABBA 被选择,因为它包含“BB”,与表 OEM 中的 OEM 完全匹配;

并且 我不想选择与 OEM 表中的 OEM 完全匹配的产品。

示例:

产品 2 oem:未选择 BAAB,因为它包含与表 oem 中的 oem 匹配的“BAAB”;

所以我使用“like”做了这个简单的 SQL 查询:

SELECT p.* FROM product p WHERE EXISTS ( SELECT 1 FROM oem WHERE p.oem LIKE CONCAT('%', oem.oem, '%') AND p.oem != oem.oem ) AND p.id > 0 ORDER BY p.id ASC LIMIT 5000;
这在我的本地环境中有效,但速度太慢,我不得不将限制数量减少到 5000。我在 p.id (PRIMARY)、p.oem 和 oem.oem 列上有索引。它在生产中不起作用(相同的数据),经过很长时间的处理后503服务不可用。

我也尝试过加入查询:

SELECT p.* FROM product p JOIN oem ON p.oem LIKE CONCAT('%', oem.oem, '%') WHERE p.oem != oem.oem AND p.id > 0 ORDER BY p.id ASC LIMIT 5000;
情况糟糕10倍。

所以我的问题是,

实现我在这里尝试做的事情的最佳方法是什么?谢谢

sql mysql performance sql-like exists
1个回答
0
投票
搜索 OEM 子串是一个不寻常的要求。

我将创建一个包含产品和 OEM 主键的新表,然后通过运行每个产品的搜索来填充此表(因为我假设每个产品都会有多个结果)

由于操作如此缓慢,您可以缓慢地批量填充此表,这样就不会破坏事务日志。例如,您先搜索产品 1,然后搜索产品 2,每次将结果分别写入表中。这将需要很长时间(就像您提出的任何子字符串匹配的查询一样),但您将有一个查找表可以在之后重复引用。

© www.soinside.com 2019 - 2024. All rights reserved.