以下SQL的准备时间为30秒以上。 SQL是错误的,还是我有近百万的结果导致数据库?这个SQL可以优化,而不是让它准备那么久吗?
UPDATE url_source_wp SET hash="ASDF2"
WHERE (url_source_wp.id NOT IN (
SELECT url_done_wp.url_source_wp FROM url_done_wp WHERE url_done_wp.url_group = 4)
)
AND (hash IS NULL) LIMIT 50
答案 0 :(得分:0)
如果准备工作是您的问题,您可以预先将其编译为存储过程。
请参阅:http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html
答案 1 :(得分:0)
似乎您可以更好地在JOIN中执行此更新,从而避免使用子选择。
UPDATE
url_source_wp AS s
INNER JOIN url_done_wp AS d
ON s.id = d.url_source_wp
SET
s.hash = 'ASDF2'
WHERE
s.hash IS NULL
AND d.url_group = 4
您需要确保在s.id
,d.url_source_wp
,s.hash
和d.url_group
上有索引。另请注意,您不能将LIMIT
与多表语法结合使用,因此如果这很重要,则此建议可能对您不起作用。