Mysql 更新包含25000多个条目的表

Mysql 更新包含25000多个条目的表,mysql,batch-processing,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' ) 我想对包含25148行的整个表执行此操作,但即使在增加了服务器上的所有限制之后,也会出现内存错误

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

UPDATE $postmeta
SET meta_key = '_bbps_topic_status',
    meta_value = '1'
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic'
   )
我想对包含25148行的整个表执行此操作,但即使在增加了服务器上的所有限制之后,也会出现内存错误。我知道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
   )

使用join方法和$POSTETA表中的post_id索引将非常有用

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 ALD add index来提高查询的性能

Hey Khalid-我添加了一个更复杂的查询,因为我不知道如何在您使用的join命令中包含该查询。@RoboRob在查询时使用date\u子部分的目的是什么不比较这个表达式的结果?我正在尝试获取所有“topic”类型的帖子,这些帖子的发布时间超过30天。当我在SELECT语句中运行它时,它似乎满足了我的要求。对不起,我的错误,比较是错误的