helbrary/db-performance

使用多更新和多插入来提高Nette数据库库性能的库。

v0.1.0 2015-05-20 17:39 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:27 UTC


README

此库适用于批量导入数据库。

在 composer.json 中安装

require: "helbrary/db-performance": "dev-master"

多插入

创建实例

$multiInsert = new MultiInsert($this->context, 'table_name');
$multiInsert->onFailure[] = function(\Exception $e) {
 ....
};

构造函数中的第三个参数是缓冲区限制(可选)。默认值为100。这意味着如果缓冲区包含100条记录且我们不添加新记录,则构建多插入并发送到数据库。缓冲区为空且向缓冲区添加新记录。

将记录添加到缓冲区(函数不会将记录插入到数据库中)

$multiInsert->add(array(
  "firstname" => "John",
  "lastname" => "Smith",
));

如果将所有记录添加到缓冲区,则必须从缓冲区将记录插入到数据库中。

$multiInsert->save();

多插入失败

如果在数据库中抛出异常,例如违反约束,则将多插入分成单个插入。这些单个插入将单独发送到数据库(一条记录 = 一个插入)。当单个插入抛出异常时,将调用回调 $onFailure。

OnFailure 回调

$multiInsert->onFailure[] = function(\Exception $e) {
	Debugger::log($e);
};

多更新

创建实例

		$multiUpdate = new MultiUpdate($context, 'page', 'title', 50);
		$multiUpdate->onFailure[] = function(\Exception $e) {
			Debugger::log($e);
		};

将记录添加到缓冲区(函数不会在数据库中更新记录)

	$multiUpdate->add(1, 'updated column text');

如果将所有要更新的记录添加到缓冲区,则必须从缓冲区将更新记录发送到数据库。

	$multiUpdate->save();

推荐缓冲区限制

缓冲区限制定义了将多少个SQL命令合并到一个多命令中。缓冲区限制的默认值为100。可以在构造函数中通过变量 $limit 修改此值。如果SQL命令经常抛出某种类型的异常,则最好设置较小的缓冲区。如果SQL命令很少抛出某种类型的异常,则最好设置较大的缓冲区。

测试 - 插入 100,000 条记录(没有 SQL INSERT 抛出异常)

  1. 逐条记录: 16分55秒
for ($i = 0; $i < 100000; $i++) {
	$this->database->table('tableName')->insert(array(
	"title" => "title" . $i,
	"description" => "description" . $i,
	));
}
  1. 在事务中逐条记录: 4分50秒
$this->database->beginTransaction();
for ($i = 0; $i < 100000; $i++) {
	$this->database->table('tableName')->insert(array(
	"title" => "title" . $i,
	"description" => "description" . $i,
	));
}
$this->database->commit();
  1. 使用 Helbrary\DbPerformance\MultiInsert 与(默认)缓冲区大小 100: 0分20秒
$multiInsert = new MultiInsert($this->context, 'tableName', 100);
for ($i = 0; $i < 100000; $i++) {
	$multiInsert->add(array(
		"title" => "title" . $i,
		"description" => "description" . $i,
	));
}
$multiInsert->save();
  1. 使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 500: 0分14秒

  2. 使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 1000: 0分12秒

  3. 使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 10000: 0分11秒