我有一个MySQl数据库,包含几个表,所有UTF-8和MyISAM存储。 在PHP中,我正在解析一个XML文件,该文件将大量数据写入表中。我只使用简单的Insert语句和mysqli函数。
表上没有那么多读取操作,插入过程中没有任何一个操作。首先,性能非常慢,所以我在脚本的开头添加了SET AUTOCOMMIT = 0。
我现在遇到的问题是我所有的插页都在例如第三个foreach循环被忽略,不会出现在mysql表中。在此之前的一切都很好。
所以我的问题是,我做错了什么,我应该怎么做?
启用自动提交=插入所有内容但非常慢 自动提交关闭=一切都很快但很多插入被忽略
希望有人有一个想法,可以提供帮助。
答案 0 :(得分:1)
关闭自动提交的MySQL速度更快,因为INSERT不会立即写入数据库;只有在执行COMMIT语句时才会保存数据。插入数据后是否有COMMIT语句?
答案 1 :(得分:1)
你应该这样试试:
<?php
try {
$db->beginTransaction();
$stmt = $db->prepare("SOME QUERY?");
$stmt->execute(array($value1));
$stmt = $db->prepare("YET ANOTHER QUERY??");
$stmt->execute(array($value2, $value3));
$db->commit();
} catch(PDOException $ex) {
//Something went wrong then rollback!
$db->rollBack();
echo $ex->getMessage();
}
注意:调用bindTransaction()
会自动关闭自动提交。
使用mysqli
时,您可以使用以下代码:
mysqli_autocommit($dbh, FALSE); // turn off auto-commit
mysqli_rollback($dbh); // if error, roll back transaction
mysqli_commit($dbh); // commit transaction