我使用下面的代码来创建和迁移表,虽然它可以工作,但是速度非常慢。大约需要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.......";
}
3条答案
按热度按时间uqjltbpv1#
如果垃圾来自
mysqldump
,则根本不使用php。简单地做j2datikz2#
您可以使用cron job来自动完成此过程,而无需等待。有时此进程因php执行超时而失败。
要增加php中的执行超时,您需要更改php.ini中的一些设置:
js5cn81o3#
问题是-这个问题不应该用php来问,而是数据库。在导入过程中,会重建索引、检查外键等等,而这正是导入实际需要花费大量时间的地方,具体取决于您的数据库结构。除此之外,硬件可能有故障(即,如果数据库位于hdd上,则导入所需的时间将明显多于ssd驱动器上的时间)。我建议首先查看mysqltuner.pl结果,然后从那里开始优化数据库。可能会在中发布一个关于如何改进数据库的问题(当然是一个单独的问题)
在导入之前禁用set foreign \u key \u checks=0,然后在导入之后使用set foreign \u key \u checks=1启用它可能会有所帮助,但这并不能完成您可以完成的所有优化。
如果您只想做的就是安排任务,这样就不必等待数据库导入完成,那么您需要实现一个任务队列(即在数据库表中)并通过crontab处理队列,正如muyin所建议的那样。