我在 WAMP 中有一个 InnoDB 表,其中包含具有以下结构的大约 4000 万条记录:
CREATE TABLE sales (
sale_id int(12) unsigned NOT NULL,
sale_type_id int(12) unsigned NOT NULL,
sale_employee_id int(12) unsigned NOT NULL,
sale_period tinyint(3) unsigned NOT NULL,
sale_minute tinyint(3) unsigned NOT NULL,
sale_second tinyint(3) unsigned NOT NULL,
sale_amount decimal(5,2) unsigned NOT NULL,
PRIMARY KEY (sale_id, sale_type_id),
KEY (sale_employee_id, sale_type_id, sale_period, sale_amount, sale_minute)
)
我正在使用 MySQLi 使用数组一次插入大约 3,000 条新记录并“内爆”,如下所示,这需要 1 到 2 分钟才能完成:
$insertArray = array();
foreach($phpArray->sales as $sale) {
$saleId = (int) $saleId;
$saleType = (int) $saleType;
$saleEmployeeId = (int) $saleEmployeeId;
$salePeriod = (int) $salePeriod;
$saleMinute = (int) $saleMinute;
$saleSecond = (int) $saleSecond;
$saleAmount = $saleAmount;
$insertArray[] = "('$saleId', '$saleType', '$saleEmployeeId', '$salePeriod', '$saleMinute', '$saleSecond', '$saleAmount')";
}
$insertSql = "INSERT IGNORE INTO sales (sale_id, sale_type_id, sale_employee_id, sale_period, sale_minute, sale_second, sale_amount) VALUES ".implode(",",$insertArray);
$insertResult = $mysqli->query($insertSql);
我处理这件事的方式有什么明显的错误吗?
INSERT IGNORE 会比 INSERT 明显慢吗? 我有一个复合 PRIMARY KEY 的事实会成为一个问题吗? 我是否需要在插入数组中的每个变量名称周围使用引号,如果不需要,删除它们是否会加快速度?
提前感谢您的任何建议!
最佳答案
我遇到了类似的问题。关闭自动提交并在一个请求中手动提交解决了我的问题。
$mysqli->autocommit(FALSE);
// loop through all the new records
foreach($newRecordsArray as $newRecord) {
... do your foreach loop per record here.....
$insertResult = $mysqli->query($insertSql);
}
//do one commit
if (!$mysqli->commit()) {
print("Transaction commit failed\n");
exit();
}
关于php - MySQLi 多行插入非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592750/