【问题标题】:MySQL Insert 20K rows in single insertMySQL 在单次插入中插入 20K 行
【发布时间】:2014-04-05 12:32:45
【问题描述】:

在我的表中,每次加载时我都会插入大约 20,000 行。现在我正在一个一个地做。从 mysql 网站我了解到使用单个插入查询插入多行更快。

我可以在单个查询中插入所有 20000 吗?

如果这 20000 行中有错误会发生什么? mysql 将如何处理?

【问题讨论】:

标签: mysql bulkinsert


【解决方案1】:

如果您要从其他表中插入行,那么您可以使用 INSERT ... SELECT 模式来插入行。

但是,如果您使用 INSERT ... VALUES 模式插入值,那么您就有 max_allowed_pa​​cket 的限制。

也来自文档:-

为了优化插入速度,将许多小操作合并到一个 大手术。理想情况下,您建立一个连接,发送数据 一次处理许多新行,并延迟所有索引更新和一致性 检查到最后。

例子:-

INSERT INTO `table1` (`column1`, `column2`) VALUES ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2"),
                                                 ("d1", "d2");

如果这 20000 行中有错误会发生什么?

如果在插入记录时出现错误,则操作将中止。

【讨论】:

  • 整个插入将被中止?还是从失败的角度来看?
  • 在这种情况下,如果有错误,最好的方法是知道插入了多少行?
  • @user3360140 作为选项之一是检查日志以防出现错误
【解决方案2】:

http://dev.mysql.com/doc/refman/5.5/en/insert.html

使用 VALUES 语法的 INSERT 语句可以插入多行。到 这样做,包括多个列值列表,每个包含在 括号并用逗号分隔。

例子:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

您可以使用代码根据您的数据源生成插入VALUES 部分。

错误:如果INSERT 语句(包括任何行)中存在错误,则操作将被中止。

生成查询 - 这将基于您的数据源,例如,如果您从 PHP 中的关联数组获取数据,您将执行以下操作:

$sql = "INSERT INTO tbl_name (a, b, c) VALUES ";
foreach($dataset as $row)
{
    $sql .= "(" + $row['a'] + ", "  + $row['a'] + ", "  + $row['a'] + ")";
    // OR
    $sql .= "($row[a], $row[b], $row[c])";
}

更多资源:

Optimize MySQL Queries – Fast Inserts With Multiple Rows

The fastest way to insert 100K records

【讨论】:

  • 记得清理你的数据;)。
【解决方案3】:

batch insert with SQL: insert into table (col...coln) values (col...coln),(col...coln)... 但是SQL长度默认限制为1M,可以更改max_allowed_pa​​cket 参数支持更大的单次插入

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多