我正在使用PHP和MySQL在两个系统之间迁移数据库。
在旧的表中,我有3个感兴趣的表:
t1
id(int(
…
t2
id(int(
t1_id(int(
d(字符串(
…
t3
id(int(
t1_id(int(
ds(字符串(
e(int(
…
在新的中,我只有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
可能是你能做的最好的。
如果t2和t3表中的索引正确,那么就没有问题。请注意,在执行左联接时,重复条目不会一次又一次地插入