我有一个 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倍。所以我的问题是,
实现我在这里尝试做的事情的最佳方法是什么?谢谢
我将创建一个包含产品和 OEM 主键的新表,然后通过运行每个产品的搜索来填充此表(因为我假设每个产品都会有多个结果)
由于操作如此缓慢,您可以缓慢地批量填充此表,这样就不会破坏事务日志。例如,您先搜索产品 1,然后搜索产品 2,每次将结果分别写入表中。这将需要很长时间(就像您提出的任何子字符串匹配的查询一样),但您将有一个查找表可以在之后重复引用。