php - MySQLi 多行插入非常慢

标签 php mysql mysqli wamp innodb

我在 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/

相关文章:

php - 删除 "wrapping"数组(删除父项,保留子项)

php - MySQL获取一组中每x分钟的列的平均值和总和

php - 无法连接到数据库。连接器返回编号 : Database sqlsrv_connect failed

php - 将表列中的 DEC 值转换为十六进制

php - 如何使用带有数组作为第二个参数的 mysqli::bind_param

php - 重新加载 php 图像(验证码)

php - MYSQL select where字段不包含某个字符串字符

php - 注销时 Cookie 不会被删除

php - 制作一个简单的搜索引擎php mysql

mysql - 在 MySQL 中强制执行唯一行