php - LEFT JOINING 两个在字符串条件下不互相引用的表是一个坏主意吗?

标签 php mysql string join

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

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

t1
id(整数)
...

t2
id(整数)
t1_id(整数)
d(字符串)
...

t3
id(整数)
t1_id(整数)
ds(字符串)
e(整数)
...

在新的中,我只有 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 可能已经是您所能做到的最好的了。

关于php - LEFT JOINING 两个在字符串条件下不互相引用的表是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474923/

相关文章:

python - 如何将变量作为值插入字典中

PHP:如何将 GZ 解压缩为字符串?

php - 我正在访问日期为 : how to assign a value when a particular date is not present? 的记录

php - Laravel - 验证 |输入字段应该是两个值之一

php - 将数据库中的值放入 '$string' 中

php - 奇怪的 PHP 错误消息

php - 使用 Zend Framework 2 连接到 mysql

php - 如何将 jQuery/AJAX 结果放入表格单元格

c++ - 给定字符串 vector (按长度排序),用于查找等长字符串范围的惯用 C++

python - 用python数据框中的新结尾替换单词结尾