MySQL 删除并加入
MySQL Delete with join
我有 2 个 table,都是 MyISAM。 Table 'dataproc' 有 600000 条记录,table 'unsubscribers' 有 2500 条记录。我正在尝试从 table a 中删除记录,当 table A 中的字段 x 与 table b 中的字段 y 匹配时。我写的查询虽然有效,但非常慢(30 分钟以上)。
DELETE e
FROM dataproc e
INNER JOIN unsubscribers j ON e.EMAIL = j.EMAIL;
我写了一篇类似的文章,它在会员编号字段上使用 WHERE e.EMAIL = j.EMAIL 进行了 LEFT 连接,它 运行 更快,但不幸的是没有相同的结果(因为并非所有会员号码都具有相同的电子邮件地址)。尽管此查询 运行 比上面的查询快很多,但它在几秒钟内就完成了。
为了使整个删除与我编写的第二个查询一样快,我是否需要在 1 个或两个索引字段上加入?有没有更好的方法来编写第一个查询以便它更快?
您也可以试试这个的 EXISTS()
版本,可能会稍微快一些:
DELETE FROM dataproc e
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
30 分钟对于 60 万条记录来说似乎很多,我相信这可以通过使用适当的索引来解决(如果您还没有)
考虑在 unsubscribers
和 dataproc
的列 EMAIL
上添加索引,如果它们还没有,它应该会显着提高您的性能。
如果LEFT JOIN
更快,跟随如何;)
DELETE e
FROM dataproc e
LEFT JOIN unsubscribers j ON e.EMAIL = j.EMAIL
WHERE j.EMAIL IS NOT NULL
并且 INDEX
是提高性能所必需的。
您可以在表中的电子邮件字段上添加非聚集索引。
ALTER TABLE dataproc ADD INDEX index_one (email)
ALTER TABLE unsubscribers ADD INDEX index_one (email)
我有 2 个 table,都是 MyISAM。 Table 'dataproc' 有 600000 条记录,table 'unsubscribers' 有 2500 条记录。我正在尝试从 table a 中删除记录,当 table A 中的字段 x 与 table b 中的字段 y 匹配时。我写的查询虽然有效,但非常慢(30 分钟以上)。
DELETE e
FROM dataproc e
INNER JOIN unsubscribers j ON e.EMAIL = j.EMAIL;
我写了一篇类似的文章,它在会员编号字段上使用 WHERE e.EMAIL = j.EMAIL 进行了 LEFT 连接,它 运行 更快,但不幸的是没有相同的结果(因为并非所有会员号码都具有相同的电子邮件地址)。尽管此查询 运行 比上面的查询快很多,但它在几秒钟内就完成了。
为了使整个删除与我编写的第二个查询一样快,我是否需要在 1 个或两个索引字段上加入?有没有更好的方法来编写第一个查询以便它更快?
您也可以试试这个的 EXISTS()
版本,可能会稍微快一些:
DELETE FROM dataproc e
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
30 分钟对于 60 万条记录来说似乎很多,我相信这可以通过使用适当的索引来解决(如果您还没有)
考虑在 unsubscribers
和 dataproc
的列 EMAIL
上添加索引,如果它们还没有,它应该会显着提高您的性能。
如果LEFT JOIN
更快,跟随如何;)
DELETE e
FROM dataproc e
LEFT JOIN unsubscribers j ON e.EMAIL = j.EMAIL
WHERE j.EMAIL IS NOT NULL
并且 INDEX
是提高性能所必需的。
您可以在表中的电子邮件字段上添加非聚集索引。
ALTER TABLE dataproc ADD INDEX index_one (email)
ALTER TABLE unsubscribers ADD INDEX index_one (email)