【发布时间】:2013-05-21 14:54:59
【问题描述】:
我运行一个 PHP 脚本,它从文件中读取数据行,对其进行分析并将它们一一插入到本地 MySQL 数据库中:
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_db);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
} else {
/* As long as there is data in the file */
while(...) {
... // analyse each row (contained in an object $data)
/* Write it to the database table. */
$mysqli->query($data->getInsertQuery($db_table));
}
}
我有 4000 万行数据。前几百万个数据集的插入速度非常快,但在过去的 6 小时内只插入了 200 万个(我现在是 3000 万个),而且似乎越来越慢(到目前为止,还没有定义索引! )。
我想知道,这是否是将数据写入表的更有效方式。如果可能的话,我更喜欢没有额外(临时)文件的解决方案。
【问题讨论】:
-
你考虑过使用
LOAD DATA INFILE吗?必须对每一行执行什么类型的分析? -
听起来更像是 PHP 的 MySQL 优化问题。您还可以尝试通过将多个插入分组为 1 个扩展插入来减少插入次数,例如
INSERT INTO `table_name` (`col1`,`col2`) VALUES ('value1', 'value2'), ('value3', 'value4'), ('value5',....) -
不确定这是否像在 Oracle 中一样适用于 MySQL,但每隔几百或几千行一个
COMMIT可能会有所帮助。数百万未提交的行可能会减慢速度。 -
您是否在使用 InnoDB,如果是 - 您是否配置了 MySQL 实例?我之所以问,是因为我时不时地进行 1 亿行插入,并且它并没有像它为你做的那样减慢。听起来您是在默认设置下运行并启用自动提交(每个查询都在自己的事务中)。
-
我会给最后 2 个 cmets 和 STT LCU 的评论一个被接受为答案的机会。这 3 个答案确实添加了尚未添加到提到的“重复”的新内容。
标签: php mysql performance insert