简而言之,在共享服务器上占用资源是不合适的。
基本上,如果您为其他进程腾出足够的时间,那并不是一件坏事。但是,像您正在讨论的那样增加 CPU 是一件坏事,并且对系统的其他用户不利。你应该在你的主循环中有一个 yield 机制(usleep(100)
例如),并使用nice
像 19 这样的大数字运行命令。
此外,听起来您正在批处理脚本中进行单独的插入/更新/等调用。使用 mysql,尽可能进行批量插入是一种更好的做法(与单个插入相比非常快)。但是,取决于您如何执行此操作,这可能是 RAM 与 CPU 时间的权衡(例如,如果您将所有插入值存储在一个字符串中,直到它们准备好使用单个插入语句插入,那么这可能会增加最多很多 RAM)。如果 RAM 有问题,您始终可以构建一个临时 SQL 文件,然后在该过程结束时导入整个文件。
批量插入看起来像(对于具有两个 varchar 列的表):
INSERT INTO `mytable` VALUES ('Field 1-Row 1', 'Field 2-Row 1'), ('Field 1-Row 2', 'Field 2-Row 2');
这将在一小部分时间内一次插入两行。
但是话又说回来,根据您描述为脚本的目的,您可能一开始就没有做很多插入。但是也许您仍然可以将所有(或许多)数据库更新/插入/删除构建到最后调用的最终脚本中?
此外,如果您确定可以在导入时保持外键的正确顺序,关闭外键检查也可以显着提高速度。
所有其他可能的建议将基于您的代码和数据库架构的特定优化(优化循环、查找、索引等)。
我在这里强烈暗示的是,您可以在共享主机中执行类似的操作而不会占用资源,但是您的数据库结构、SQL 语句和算法(循环等)必须高度优化。如果你这样做,一个额外的好处是你的过程也将很快完成。有一个常见的误解是 php + mysql = 慢/cpu hog,但 99% 的时间它是编程或数据库设计问题。他们应该能够轻松处理那么多记录。