helbrary / db-performance
使用多更新和多插入来提高Nette数据库库性能的库。
v0.1.0
2015-05-20 17:39 UTC
Requires
- php: >= 5.3.7
- nette/database: >= 2.2.0
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 抛出异常)
- 逐条记录: 16分55秒
for ($i = 0; $i < 100000; $i++) { $this->database->table('tableName')->insert(array( "title" => "title" . $i, "description" => "description" . $i, )); }
- 在事务中逐条记录: 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();
- 使用 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();
-
使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 500: 0分14秒
-
使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 1000: 0分12秒
-
使用 Helbrary\DbPerformance\MultiInsert 与缓冲区大小 10000: 0分11秒