更新包含超过25,000个条目的表

时间:2014-09-05 19:24:33

标签: mysql batch-processing

我想尝试根据另一个表中的搜索在SQL表中设置两个值。我的查询如下:

UPDATE $postmeta
SET meta_key = '_bbps_topic_status',
    meta_value = '1'
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic'
   )

我想对25,148行的整个表执行此操作,但即使增加了服务器上的所有限制,我也会收到内存错误。我知道MySQL不允许你在500组中批量操作,但有没有办法编写一个将这个操作分成更小块的脚本?

提前致谢!

编辑:查询包含日期范围:

UPDATE $postmeta
SET meta_key = '_bbps_topic_status',
    meta_value = '1'
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic'
    AND DATE_SUB(
        CURDATE(),
        INTERVAL 30 DAY
        ) <= post_date
   )

1 个答案:

答案 0 :(得分:2)

使用联接方法和来自post_id表的$postmeta的索引会很有帮助

UPDATE $postmeta  m
JOIN $posts p ON(p.ID = m.post_id )
SET m.meta_key = '_bbps_topic_status',
    m.meta_value = '1'
 WHERE p.post_type='topic'
 AND p.post_date <= NOW() - INTERVAL 30 DAY

请注意,您正在使用将针对每一行运行的子查询,而是使用join也在日期列上添加索引以提高查询的性能