php - 如何优化 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.......";
}
解决方案
问题是 - 这个问题不应该用 PHP 来问,它是用数据库来问的。在导入过程中,会重建索引、检查外键等等,而这正是导入实际上需要花费大量时间的地方,具体取决于您的数据库结构。除此之外,硬件可能有问题(即,如果数据库在 HDD 上,导入将花费比在 SSD 驱动器上明显更多的时间)。我建议先查看 mysqltuner.pl 结果,然后从那里开始优化您的数据库。也许在 SO 中发布一个关于如何改进数据库的问题(当然作为一个单独的问题)
在导入之前禁用 SET FOREIGN_KEY_CHECKS=0 然后在导入之后使用 SET FOREIGN_KEY_CHECKS=1 启用它可能会有所帮助,但它不会完成您可以做的所有优化。
如果你只是想做调度任务,这样你就不必等待数据库导入完成,你需要实现一个任务队列(即在数据库表中)并通过 crontab 处理你的队列,就像木印一样建议。
推荐阅读
- excel - 基于单元格和固定值的自动筛选
- python - numpy - 为二维数组中的每对行计算 f(v1,v2) 的最有效方法
- excel - 如何复制包含带有公式的空白单元格的列中的最后一个非空白单元格
- c# - 进入控制器前的堆栈溢出错误
- node.js - 使用带有 nodejs 的 asyn 函数填充不起作用
- mustache - 替换JS文件中的mustache标签并输出替换后的JS
- arrays - 查找总和为 0 的数组的所有子集
- jquery - 如何保持所有页面的主题颜色
- c - openssl/rsa.h:C windows 中没有这样的文件或目录
- spring-boot - 如何运行一次性脚本来操作 jpa 实体数据并跟踪环境?