如何优化php代码上传sql转储

js81xvg6  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(322)

我使用下面的代码来创建和迁移表,虽然它可以工作,但是速度非常慢。大约需要10分钟才能完成创建250个表和迁移数据。转储文件的总大小约为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.......";

    }
uqjltbpv

uqjltbpv1#

如果垃圾来自 mysqldump ,则根本不使用php。简单地做

mysql -h host.name -u ... -p... < dump_file.sql
j2datikz

j2datikz2#

您可以使用cron job来自动完成此过程,而无需等待。有时此进程因php执行超时而失败。
要增加php中的执行超时,您需要更改php.ini中的一些设置:

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds
js5cn81o

js5cn81o3#

问题是-这个问题不应该用php来问,而是数据库。在导入过程中,会重建索引、检查外键等等,而这正是导入实际需要花费大量时间的地方,具体取决于您的数据库结构。除此之外,硬件可能有故障(即,如果数据库位于hdd上,则导入所需的时间将明显多于ssd驱动器上的时间)。我建议首先查看mysqltuner.pl结果,然后从那里开始优化数据库。可能会在中发布一个关于如何改进数据库的问题(当然是一个单独的问题)
在导入之前禁用set foreign \u key \u checks=0,然后在导入之后使用set foreign \u key \u checks=1启用它可能会有所帮助,但这并不能完成您可以完成的所有优化。
如果您只想做的就是安排任务,这样就不必等待数据库导入完成,那么您需要实现一个任务队列(即在数据库表中)并通过crontab处理队列,正如muyin所建议的那样。

相关问题