我正在尝试寻找一种方法来加速 PHP PDO 中的 MySQL 表创建。我正在使用 PHP 5.3 和 MySQL 5。
每个表都是使用类似于以下代码创建的:
CREATE TABLE `moxedo`.`mox_config_8423` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , `group_id` INT(3) UNSIGNED NOT NULL , `is_enabled` INT(1) UNSIGNED NOT NULL , `tag` VARCHAR(255) NOT NULL , `name` VARCHAR(80) NOT NULL , `value` VARCHAR(255) NOT NULL , `description` TEXT NOT NULL , `init_params` TEXT NOT NULL , `datetime_added` DATETIME NOT NULL , `datetime_lastmodified` DATETIME NOT NULL , `timestamp_univ` BIGINT(14) NOT NULL , PRIMARY KEY ( `id` ) )
ENGINE = InnoDB;
ALTER TABLE `moxedo`.`mox_config_8423` ADD UNIQUE `ix_u_tag_ad` ( `tag` );
我有大约 120 个这样的双行查询要执行(总共 240 个查询)。根据我的基准测试,CREATE TABLE
位需要 0.12 秒,ALTER TABLE
位需要 0.07 秒。因此,如果我分别运行每个查询,大约需要 24 秒才能完成。
有没有一种方法可以在 PDO 中使用准备好的语句一次执行所有 240 个查询,即对 PHP 使用 PDO::prepare
。我只是在寻找一种方法来显着加快速度。
提前致谢。
最佳答案
准备好的语句允许您基本上将语句视为存储函数或过程。
这意味着您定义准备好的语句并使用不同的参数多次调用它。
它不允许您参数化表名或列名或关键字,只能参数化值(用于过滤、排序、插入、更新等)。
因此,准备好的语句可以精确地蹲下以提高性能。相反,您必须执行 2 个操作 PREPARE
和 EXEC
,这实际上最终可能会减慢速度(只是一点点)。
任何数据库系统中的事务都不会提高速度。相反,它们会降低速度。这是您必须为他们所做的事情付出的代价,即确保所有数据都正确或根本没有,没有 halfway there
状态。如果出现故障,它会清理所有内容,就好像它甚至没有尝试过任何东西一样。
此外,MySQL 中的事务对 DDL(数据定义语言)没有影响,这意味着 CREATE
和 ALTER
语句不以事务模式保存,而是立即执行。
现在我们清除了所有的迷雾,我们可以回答这个问题了:
- 将所有查询连接成一个大查询;
- 避免为每个查询重复连接到数据库;每次沟通都需要时间;
- 不要使用
$pdo->startTransaction();
/$pdo->commit();
使用START TRANSACTION
/COMMIT
直接在SQL代码中; - 一次运行所有查询;
- 如果可能,不要使用 PHP 生成查询;
- 将其写入一个文件,也许使用 PHP 作为表前缀和其他小文本片段;
- 不要指望通过检查 ORM 结构或类反射生成的 SQL 代码会像大多数应用程序安装程序一样快,因为大多数应用程序安装程序都有一个包含安装所需的所有结构的文件;
作为代码示例,您可能会在打包应用程序进行部署之前运行(建议 1、6):
$table_queries = '';
foreach($table_names AS $table_name) {
$table_queries .= function_that_generates_table_query($table_name);
}
file_put_contents('all_table_creates_qeries.sql', $table_queries);
作为您的deployers/users 可能在应用程序自行安装时运行的代码示例(建议 2、4、5):
$table_queries = file_get_contents('all_table_creates_qeries.sql');
$pdo->exec($table_queries);
关于php - 使用准备好的语句或其他优化 PHP PDO 中的表创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250232/