我在 CLI 模式下使用 PHP 5.5 和本地 MySQL服务器5.6.20-1 + deb.sury.org~trusty + 1- log - (Ubuntu)。
我有一堆包含DDL和DML语句的SQL文件。这些语句旨在将数据库升级到最新版本,并且需要执行它们才能完成工作。没有一个语句选择要检索的任何记录,他们所做的只是更改结构和/或INSERT
/ DELETE
/ UPDATE
。唯一的SELECT
语句是INSERT INTO SELECT
或SELECT INTO
。值得一提的是,每个文件可能包含由分号分隔的多个SQL语句。
我编写了一个PHP脚本来读取和执行这些针对数据库的SQL。问题是一个特定文件需要很长时间才能执行。在分析之后,我发现问题是INSERT INTO SELECT
语句,它试图插入大约30k的记录。
为了优化插入,我在插入之前通过ALTER TABLE .. DISABLE KEYS;
禁用了表键,并在插入完成后重新启用它,并且当我在mysql控制台中测试它时它工作。但是当我回到我的PHP CLI脚本时,它花了与以前相同的时间。
确保我使用mysql < file.sql
命令测试了所有文件的执行情况。结果如下:
PDO->exec();
花了1000多秒。
mysql < file.sql
花了大约2秒钟。
为了防止任何误解,我采用上述两种方式执行完全相同的陈述。
有谁知道为什么PDO需要的时间比mysql控制台长得多?