我正在使用 PHP 和 MySQL 在 2 个系统之间迁移数据库。
在旧表中,我有 3 个感兴趣的表:
t1
id(整数)
...
t2
id(整数)
t1_id(整数)
d(字符串)
...
t3
id(整数)
t1_id(整数)
ds(字符串)
e(整数)
...
在新的中,我只有 t1 和 t2
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
可能已经是您所能做到的最好的了。
关于php - LEFT JOINING 两个在字符串条件下不互相引用的表是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474923/