使用另一个大表中的值更新大MySQL表

bcs8qyzn  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(133)

我有一个大约有200万行(450 Mb)的表,我需要通过检查另一个具有完全相同结构和大约120万行的表来将数据填充到单个列中。我无法找到一种方法来做到这一点,不崩溃或超时。情况如下。
在一个包含近200万条记录的表中,大约有11000个不同的名称。我需要获取与表A中的每个不同名称相关联的代码,然后将该代码插入到表B中具有该名称的所有行中。这听起来很容易,但没有什么工作,因为它必须搜索200万行,每次找到正确的行。
我试过简单的更新查询-没有运气。我试过SSH访问,没有成功,使用批处理甚至一个单一的查询都会失败。我尝试从表B中一次查找一行,然后通过下面的代码在表A中查找代码,然后更新表B,但一次仍然只能完成2000行。

global $wpdb;
$sql = "SELECT t2.ID, t1.code FROM my_records AS t1 INNER JOIN my_records_new AS t2 ON t1.name = t2.name WHERE t2.code = '' LIMIT 20000;";
$resArr = array(); 
$rows = $wpdb->get_results($sql);
foreach ($rows as $obj) { 
    $tid = $obj->ID; 
    $tcode = $obj->code; 
    $resArr[$tid]['tid'] = $tid;
    $resArr[$tid]['tcode'] = $tcode;
} 
foreach($resArr as $res) { 
    $tid = $res['tid']; 
    $tcode = $res['tcode']; 
    $wpdb->update( 
        'my_records_new', 
        array(  
            'code' => $tcode,
        ), 
        array( 'ID' => $tid ), 
        array( 
            '%s', 
        ), 
        array( '%d' ) 
    );
}

我不认为这是过于复杂,所以我相信一定有一种方法可以有效地做到这一点,而不必运行一个文件1000次,一次做几百行。
任何Maven建议赞赏。
像“update my_records_new set code ='sdfsdf' where name ='abc'”这样的查询即使作为单个查询也会超时,更不用说11000了。
尝试向表中添加索引也会超时。继续运行PHP页面,一次添加大约800个更新。

xzv2uavs

xzv2uavs1#

感谢aynber对此的建设性回应。
虽然我不明白链接页面上的任何内容,但我设法对新表上的索引列进行了猜测,虽然phpmyadmin索引请求超时并且似乎失败,但重新运行为更新行而编写的PHP脚本现在运行得更快,我将能够相当快地批量更新表。

相关问题