【问题标题】:Conditionally update a huge table having millions of records有条件地更新具有数百万条记录的巨大表
【发布时间】:2014-04-05 14:21:53
【问题描述】:

我有一个巨大的 mysql 2 个表,每个表包含超过 100 万个数据。目前我必须将一些列从一个表合并到另一个表,然后有条件地更新第一个表。

这是一个示例代码,向您展示我的意思

目前我正在使用 Laravel 4.1 来执行查询。并按块更新数据。不幸的是,如果我尝试在此方法中更新超过 20 个条目,服务器就会崩溃。

$records = Record::where('MINE_ID','!=','1')->skip($skip)->take($take)->get();
//Equivalent to "SELECT * FROM records LIMIT 20 OFFSET 20"

        foreach ($records as $record) {

                $id = $record->room_id;
                $lat = $record->lat;
                $lng = $record->lng;

                $update = DB::table('accidents')
                            ->where('room_number', $id)
                            ->update(array(
                                'LATITUDE' => $lat,
                                'LONGITUDE' => $lng
                                ));

        }

MySQL 表引擎是 innoDB。有没有更快更简单的方法来做到这一点?

任何帮助将不胜感激。

附加信息 我已经为所有表添加了索引。我听说删除索引有帮助?此外,它们是 BIGINT。会影响性能吗?

【问题讨论】:

  • 在处理大型数据集时,通常最好使用原始 SQL 查询。
  • 谢谢戈登先生...我更关心方法。我粘贴的代码有效.. 但我正在寻找不需要 apache 服务器或 php 的直接查询。任何帮助都非常感谢..
  • 所有信息(包括代码)都不是很有用。这是一个数据库问题,而不是 php 或 laravel 问题。根据您的描述,您似乎可以通过一两个查询来完成所有这些,这将非常快。您能否描述所涉及的表格并准确说明您要对它们做什么?
  • 很抱歉没有在这里找到有用的信息。我现在正在添加尽可能多的信息

标签: php mysql database laravel-4


【解决方案1】:

您可能需要考虑先将完整数据作为临时表加载到您的表中,然后删除原始表,将临时表重命名为原始表的名称。它应该更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多