0

想象一下,你有两张桌子。

表格栏:

+-------+--------------+------+-----+---------+-------+
| 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_alternativefoo

我可以使用以下查询:

DELETE FROM foo WHERE name IN (SELECT name_alternative FROM bar);

但这需要很长时间才能在两个表中执行大量记录。

所以我想知道这个查询是否有更好的选择。

4

3 回答 3

1

除了@dan1{4} 答案之外,我的猜测是它需要很长时间,因为bar(name).

您不需要涵盖整个 255 个字符的索引,具体取决于您的字符串,即如果很多行的第一个字符不同,则在几个字符上创建一个索引

CREATE INDEX indexname ON bar(name(8))

8是您可能要细化的建议值。该索引将帮助 mysql 定位与foo.namealternative匹配的每个条形

于 2013-02-28T11:31:23.307 回答
1

这是另一种可行的方式,我认为它会更有效:

DELETE FROM bar
    USING foo, bar
    WHERE name_alternative = name

这是一个有效的 SQLFiddle 示例

请参阅删除文档

于 2013-02-28T11:23:49.500 回答
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
于 2013-02-28T11:30:24.753 回答