【问题标题】:Should I rate-limit or reduce my database queries?我应该限制或减少我的数据库查询吗?
【发布时间】:2011-07-23 23:33:34
【问题描述】:

我正在创建一个 PHP 脚本,它将文本文件中的一些数据导入 MySQL 数据库。这些文本文件非常大,一个平均文件将有 10,000 行,每行对应于我想要在我的数据库中的一个新项目。 (我不会经常导入文件)

我担心从文件中读取一行,然后执行 INSERT 查询,连续 10,000 次可能会导致一些问题。我有更好的方法吗?我应该对所有 10,000 个值执行一次 INSERT 查询吗?还是会一样糟糕?

也许我可以达到一个媒介,一次执行 10 或 100 个条目。真的我的问题是我不知道什么是好的做法。也许连续 10,000 个查询很好,我只是担心什么。

有什么建议吗?

【问题讨论】:

    标签: php mysql database rate-limiting


    【解决方案1】:

    是的

    <?php
    $lines = file('file.txt');
    $count = count($lines);
    $i = 0;
    $query = "INSERT INTO table VALUES ";
    foreach($lines as $line){
        $i++;
        if ($count == $i) {
            $query .= "('".$line."')";
        }
        else{
            $query .= "('".$line."'),";
        }
    }
    echo $query;
    

    http://sandbox.phpcode.eu/g/5ade4.php

    这将进行一次查询,比单行查询方式快多个!

    【讨论】:

    【解决方案2】:

    使用 High Performance MySQL 的作者建议的准备好的语句。它节省了大量时间(节省了浪费的协议和 SQL ASCII 代码)。

    【讨论】:

    • 哦,太好了!我不知道有这样的东西存在。我会定义的。为我的导入使用准备好的语句。谢谢!
    【解决方案3】:

    我会在一次包含所有值的大型查询中执行此操作。不过,为了确保您在之前运行 START TRANSACTION; 和之后运行 COMMIT; ,以便在执行查询期间出现问题(这是可能的,因为它很可能会运行相当长的时间) ,数据库不会受到影响。

    【讨论】:

    • 请注意,发出多次插入会降低您跟踪错误的能力。如果其中一行插入失败,您将无法检测到哪一行触发了错误(当然,会丢弃整个批处理作业,而不是至少有好的作业)
    • 是的。我假设所有插入的数据都是正常的,所以没有一行应该插入失败。在将数据添加到查询字符串之前,应对数据执行验证以确保这一点。
    • IMNSHO,丢失整个事务比提交部分事务更可取。如果验证可能是一个问题,我会尝试在单个事务的框架中解决它,例如通过首先插入临时表,在新数据和现有数据之间查询冲突行,然后传输数据一旦我确定一切正常,从临时表到主表。这将是两全其美(以更高的代码复杂性为代价)
    • 我同意丢失交易通常是您想要的。这一切都取决于应用程序的实际需求
    • 是的,只有一部分被插入的行可能是最糟糕的事情。如果发生这种情况,您必须手动检查数据库以查看导入的程度,然后编辑导入文件以删除已插入的行,然后重新运行导入脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2016-07-10
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2011-06-11
    • 2011-05-21
    相关资源
    最近更新 更多