首页 > 解决方案 > 如何优化 PHP 代码上传 SQL 转储

问题描述

我正在使用下面的代码来创建和迁移表,虽然它可以工作,但速度很慢。完成创建大约 250 个表和迁移数据大约需要 10 分钟。转储文件的总大小约为 1 Mb。请注意,这是在 localhost 上,当部署到网络不可靠的服务器上时,恐怕会花费 5 倍的时间。

这段代码是否可以优化为在 30 秒内运行?

function uploadSQL ( $myDbName ) {

        $host = "localhost";
        $uname = "username";
        $pass = "password";
        $database = $myDbName; 
        $conn = new mysqli($host, $uname, $pass, $database);
        $filename = 'db.sql'; 

        $op_data = '';
        $lines = file($filename);
        foreach ($lines as $line)
        {
            if (substr($line, 0, 2) == '--' || $line == '')
            {
                continue;
            }
            $op_data .= $line;
            if (substr(trim($line), -1, 1) == ';')
            {
                $conn->query($op_data);
                $op_data = '';
            }
        }
        echo "Table Created Inside " . $database . " Database.......";

    }

标签: phpmysqloptimizationupload

解决方案


问题是 - 这个问题不应该用 PHP 来问,它是用数据库来问的。在导入过程中,会重建索引、检查外键等等,而这正是导入实际上需要花费大量时间的地方,具体取决于您的数据库结构。除此之外,硬件可能有问题(即,如果数据库在 HDD 上,导入将花费比在 SSD 驱动器上明显更多的时间)。我建议先查看 mysqltuner.pl 结果,然后从那里开始优化您的数据库。也许在 SO 中发布一个关于如何改进数据库的问题(当然作为一个单独的问题)

在导入之前禁用 SET FOREIGN_KEY_CHECKS=0 然后在导入之后使用 SET FOREIGN_KEY_CHECKS=1 启用它可能会有所帮助,但它不会完成您可以做的所有优化。

如果你只是想做调度任务,这样你就不必等待数据库导入完成,你需要实现一个任务队列(即在数据库表中)并通过 crontab 处理你的队列,就像木印一样建议。


推荐阅读