在字符串条件下,LEFT JOINING两个互不引用的表是个坏主意吗


Is LEFT JOINING two tables with no reference to each other ON string conditions a bad idea?

我正在使用PHP和MySQL在两个系统之间迁移数据库。

在旧的表中,我有3个感兴趣的表:

t1
id(int(

t2
id(int(
t1_id(int(
d(字符串(

t3
id(int(
t1_id(int(
ds(字符串(
e(int(

在新的中,我只有t1t2

t2.d可以有例如"abc">的"def">t3.ds可以有"abc">"def">,或abc,def">

我创建了以下查询:

SELECT
    t2...,
    t3.e
FROM t2
LEFT JOIN t3
    ON t2.id = t3.id
    AND t3.ds LIKE CONCAT("%", t2.d, "%")
WHERE t2.id = ?

查询确实有效,但当我有很多条目时,我担心这个JOIN的性能(为了迁移,我显然从t1开始迭代每个条目,每个条目在t2和t3中都有多个条目(。

因此,在最后,我回到了一个问题——这样加入它们值得吗?还是应该使用不同的方法,比如在PHP级别上单独查询或数据处理?

以下是MySQL EXPLAIN(如果有任何相关的话((不幸的是,这对我来说意义不大,所以我感谢任何帮助(:

id | select_type | table | type | possible_keys        | key           | key_len | ref                    | rows  | Extra
1  | SIMPLE      | modi  | ref  | PRIMARY,order_number | order_number  | 4       | const                  | 3     | Using temporary; Using filesort
1  | SIMPLE      | ai    | ref  | detail_number        | detail_number | 4       | max.modi.detail_number | 1     | NULL
1  | SIMPLE      | edi   | ALL  | NULL                 | NULL          | NULL    | NULL                   | 26389 | Using where; Using join buffer (Block Nested Loop)

如果您关心性能,那么不要将列表存储在字符串中。您应该有一个连接表,列表中的每个元素都有一行。换句话说,'abc, def'是否定的。另一个有两行的表,一行用于'abc',另一行用于'def'

因为您的数据结构没有针对SQL进行优化,所以从性能角度来看,您几乎无能为力。like可能是你能做的最好的。

如果t2和t3表中的索引正确,那么就没有问题。请注意,在执行左联接时,重复条目不会一次又一次地插入