简单的mysql更新语句挂在大型数据库上

时间:2014-08-01 17:48:18

标签: mysql database optimization

update temp_parent_rating_emails pre
set reminders_count = (select count(1) from vendor_rating_email vre where vre.parent_email_id = pre.email_id);

上面的查询在我的小型mysql数据库上运行正常但挂在我们较大的临时数据库上。有谁知道为什么或如何更好地优化这个?

2 个答案:

答案 0 :(得分:1)

不使用子查询,而是尝试使用内嵌视图,如下所示,以便vendor_rating_email表只扫描一次。

update temp_parent_rating_emails pre
    JOIN
    (
        select 
            parent_email_id,
            count(*) cnt_email
        from vendor_rating_email
        group by parent_email_id
    ) vre ON  vre.parent_email_id = pre.email_id
SET pre.reminders_count = vre.cnt_email;

另外,请考虑在temp_parent_rating_emails (parent_email_id)vendor_rating_email (email_id)上创建索引。

<强>参考

mysql update join on SO

答案 1 :(得分:0)

如果还没有索引,请尝试添加索引

ALTER TABLE vendor_rating_email ADD INDEX (parent_email_id) ;

然后查看您的查询是否运行得更快。大多数情况下,如果您的查询在小型数据库上运行速度很快,而在大型数据库上运行速度慢,则需要索引。