【问题标题】:MYSQL configuration for multiple and bulk records insert query用于多条和批量记录插入查询的 MYSQL 配置
【发布时间】:2014-06-11 12:46:44
【问题描述】:

我插入超过 100 万条记录,我的每个插入查询一次通过单个查询插入 15000 条记录,插入 100 万条记录需要 1 分钟

像这样:-

insert into records (data) values ('a'),('b'),('c'),('d')........................

但是当我一次执行 2 个查询时,mysql 变慢并且需要 25-30 分钟。

我应该使用什么mysql配置来解决这个问题

【问题讨论】:

  • 所有查询都插入同一张表吗?
  • 没有不同的表。

标签: php mysql sql


【解决方案1】:

你是说你像这样插入 15000 条记录:

insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')
insert into records (data) values ('a'),('b'),('c'),('d')

.....

如果是这样,请尝试使用 INSERT ALL

INSERT ALL INTO records (data) values
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')
('a'),('b'),('c'),('d')

...........

这可能需要一些工作,但如果您将所有进入同一个表的插入分组以便您可以使用 INSERT ALL,您可以减少服务器需要解析的语句数量,这非常昂贵。

【讨论】:

  • 我的查询就像第一次插入table1(数据)值('a'),('b'),('c'),('d')...... .....................第二次插入table2(数据)值('a'),('b'),('c'),('d')。 .....................和表不一样
  • 所以你有 15000 个不同的表要插入?
  • 没有表只有 2 。我通过 2 个脚本插入数据,每个脚本将记录插入到 1 个表中,因此 2 个脚本将数据插入到 2 个不同的表中
  • 那么我坚持我的建议,解析语句非常昂贵,将每个脚本的 15000 条语句减少到每个脚本 1 条应该会大大加快进程。
【解决方案2】:

你应该使用事务。这会有所改善,但不一定能解决您的问题。

在 PHP 中:

$pdo = new PDO($dsn, $username, $password);
$pdo->beginTransaction();

foreach ($somethings as $something) {
    $stmt = $pdo->prepare("INSERT INTO records VALUES (?)");
    $stmt->execute([$something]); // PHP 5.5 will like this
    $stmt->execute(Array($something)); // PHP 5.4 or under.   
}

$pdo->commit();

但实际上对于如此大的数据条目,您应该考虑只生成一次发送 15000 个值的查询...

【讨论】:

  • 由于所有的插入都具有相同的语句结构,您可以取出 $pdo->prepare 并在循环中重用它。是的,像 INSERT ALL 这样的东西会在这里创造奇迹。
  • 我想知道my.cnf的配置
  • 无法通过配置更改来完成,因为您使用 sql 的方式根本上是错误的。
猜你喜欢
  • 2012-12-16
  • 2020-03-18
  • 1970-01-01
  • 2010-10-14
  • 2011-02-20
  • 2016-01-08
  • 2017-07-23
  • 2013-04-25
  • 2014-09-27
相关资源
最近更新 更多