想象一下,你有两张桌子。
表栏:
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
表foo:
+------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| name_alternative | varchar(255) | YES | | NULL | |
+------------------+--------------+------+-----+---------+-------+
并且您希望从表bar
中移除与name
name_alternative
具有相同foo
值的行
我可以使用以下查询:
DELETE FROM foo WHERE name IN (SELECT name_alternative FROM bar);
但这需要很长时间才能在两个表中执行大量记录。
所以我想知道这个查询是否有更好的替代方案。
答案 0 :(得分:1)
这是另一种可行的方法,我认为它会更有效:
DELETE FROM bar
USING foo, bar
WHERE name_alternative = name
答案 1 :(得分:1)
除了@ dan1 {4}之外,我的猜测是需要很长时间,因为bar(name)
上没有索引。
您不需要覆盖整个255个字符的索引,具体取决于您的字符串,即如果许多行中的第一个字符不同,则在几个字符上创建索引
CREATE INDEX indexname ON bar(name(8))
8
是您可能想要优化的建议值。该索引将帮助mysql找到与 foo.namealternative 匹配的每个 bar 行
答案 2 :(得分:0)
delete from bar
using (
select foo.name_alternative
from
bar
inner join
foo on bar.name = foo.name_alternative
) s
where bar.name = s.name_alternative