gpt4 book ai didi

mysql - 大量sql插入的优化

转载 作者:行者123 更新时间:2023-11-29 02:05:43 25 4
gpt4 key购买 nike

我必须在数据库中插入 100k+ 条记录,但我遇到了一些内存问题。 $_data 是一个包含数据数组的数组。我什至增加了内存大小,但仍然遇到问题

// VERSION 1
protected function save() {

$memory_limit = ini_get('memory_limit');
ini_set('memory_limit', '512M');

$sql = "
INSERT INTO table (
c1,
c2,
c3,
c4,
c5,
c6,
c7,
c7,
c9,
c10,
c11
) VALUES (?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
c10 = VALUES(c10),
c11 = VALUES(c10),
c12 = VALUES(c12)
";
$db = Zend_Registry::get('db');
$stmt = new Zend_Db_Statement_Pdo($db, $sql);
foreach($this->_data as $entry){
$stmt->execute($entry);
}
unset($this->_data, $stmt, $sql);
ini_set('memory_limit', $memory_limit);

第二个尝试在多插入中插入所有条目,但不是更好。

// VERSION 2
protected function save2(){
$question_marks = str_repeat('?,', count($this->_data[0]));
$question_marks = trim($question_marks, ',');
$question_marks = str_repeat("($question_marks),", count($this->_data));
$question_marks = trim($question_marks, ',');
$sql = "
INSERT INTO table (
c1,
c2,
c3,
c4,
c5,
c6,
c7,
c7,
c9,
c10,
c11
) VALUES $question_marks
ON DUPLICATE KEY UPDATE
c10 = VALUES(c10),
c11 = VALUES(c11),
c12 = VALUES(c12)
;";
$db = Zend_Registry::get('db');
$stmt = new Zend_Db_Statement_Pdo($db, $sql);
$insert_values = call_user_func_array('array_merge', $this->_data);
$stmt->execute($insert_values);
$affected_rows = $stmt->rowCount();
if ($affected_rows){
// @todo log
}
unset($this->_data);
unset($stmt, $sql, $insert_values, $affected_rows, $question_marks);

列名不是原来的。有什么建议吗?


我将尝试将数据数组拆分为 5k 个条目并分批插入。还尝试查看在 mysql cnf 中修改 max_allowed_pa​​cket 有何帮助。同时,我将不胜感激任何建议。谢谢

更新

在我的例子中 将 max_allowed_pa​​cket 从 16M 修改为 1024M 有所帮助,我确实在不拆分数组的情况下进行了插入。

最佳答案

你怎么知道你有内存问题而不是脚本执行超时?

无论如何,我会尝试使用简单的 mysql_query

此外,请查看并确保读取数据并准备将其插入数据库的部分没有内存泄漏

关于mysql - 大量sql插入的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com