0

我正在尝试找到一种方法来加速 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 个查询)。根据我的基准测试,钻头需要 0.12 秒,CREATE TABLE钻头需要 0.07 秒ALTER TABLE。因此,如果我单独运行每个查询,大约需要 24 秒才能完成。

有没有一种方法可以在 PDO 中使用准备好的语句来一次执行所有 240 个查询,即PDO::prepare用于 PHP。我只是在寻找一种方法来显着加快速度。

提前致谢。

4

2 回答 2

3

准备好的语句允许您基本上将语句视为存储函数或过程。

这意味着您定义准备好的语句并使用不同的参数多次调用它。

它不允许您对表名或列名或关键字进行参数化,仅对值进行参数化(用于过滤、排序、插入、更新等)。

因此,准备好的语句可以精确地为性能而蹲下。相反,您必须执行 2 次操作PREPAREEXEC这实际上可能最终会减慢速度(只有一点)。

任何数据库系统中的事务对提高速度都没有任何作用。相反,它们会降低速度。这是您必须为他们所做的事情付出的代价,即确保所有数据都正确或根本没有,没有halfway there状态。如果某些事情失败了,它会清理一切,就好像它甚至没有尝试过任何事情一样。

MySQL 中的事务也对 DDL(数据定义语言)没有影响,这意味着CREATE语句ALTER不是以事务模式保存,而是立即执行。

现在我们清除了所有的迷雾,我们可以回答这个问题:

  • 将所有查询连接成一个大查询;
  • 避免每次查询重复连接数据库;每次沟通都需要时间;
  • 不要在SQL代码中直接使用$pdo->startTransaction();/$pdo->commit();使用START TRANSACTION/ ;COMMIT
  • 一次性运行所有查询;
  • 如果可能,不要使用 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);

作为代码示例,您的部署者/用户可能会在应用程序自行安装时运行(建议 2、4、5):

$table_queries = file_get_contents('all_table_creates_qeries.sql');
$pdo->exec($table_queries);
于 2012-06-28T22:12:41.380 回答
1

在尝试了包括连接 SQL 查询在内的多种方法后,我仍然没有得到我想要的性能改进。

然而,通过从 PDO 切换到 MySQLi,我注意到我获得了显着的性能提升,尽管是“纸上谈兵”。

当我使用 PDO 时,SQL 查询必须在将控制权交还给页面之前执行整个脚本。然而,对于 MySQLi,它以某种方式将 SQL 查询交给(到后台),然后将控制权发送回页面。

因此,我没有等待 24 秒来执行 120 个表,而是使用 MySQLi 等待 0.1 秒。理论上它需要大约相同的时间(因为如果您使用 PHPMyAdmin 或 MySQL Workbench,您会注意到在使用 列出所有表之前需要几秒钟SHOW TABLES),但是因为我的脚本不会等待在我的页面返回之前执行整个 SQL 查询,用户体验更好。

此外,因为无论如何我需要使用这些表来做任何事情可能需要 30 多秒,所以我没有看到任何主要的缺点,而且您的脚本似乎要快得多。

因此,如果您需要使用安装脚本创建大量表,我建议您不要使用 PDO,而是使用 MySQLi。如果您一次创建一个表或执行其他数据库任务,您仍应使用 PDO。

感谢所有的贡献。

于 2012-06-29T03:27:08.363 回答