【问题标题】:Does single multiple INSERT in MySQL give a high difference in speed when you insert just several rows?当您仅插入几行时,MySQL 中的单个多个 INSERT 是否会产生很大的速度差异?
【发布时间】:2015-07-07 16:36:02
【问题描述】:

我有一家网上商店。 用户将一些产品添加到购物车中,所以我应该将这些行插入到 order_products 表以及 order_products_components 表中,它们通过几个外键相互连接。

据您了解,用户通常只添加几个产品,因此是否有必要构建困难的单多次插入,或者我必须只使用 foreach 循环?

此外,由于我使用外键,因此在每次插入产品后,我需要获取一个行主键来将产品组件插入另一个表。

那么我是否可以只使用 foreach 循环插入多次,否则会降低我的系统速度?

【问题讨论】:

  • 这取决于这些查询的数量以及您处理它们的程度。
  • 卡米尔是正确的。如果您认为您将看到服务器上的容量急剧增加,那么多个插入是一个好主意。他们可以很神奇。但你是对的,少量,没什么大不了的。如果您使用多个插件,它可能会让您不必提前进行硬件升级。

标签: php mysql performance pdo insert


【解决方案1】:

我多年来制定的经验法则:“批量”INSERTs 将速度提高 因子 10。(当然,“您的里程可能会有所不同”。)一个@ 987654322@ 有开销:必须将其发送到服务器,进行解析等。在将 100 行批处理在一起之后,您将获得“递减收益”。另一方面,将 5 行批处理在一起只会使您的速度提高大约 3 倍。

如果您对性能要求严格,其他需要关注的事情:

FOREIGN KEYs 有一个重要的开销——每个 FK 约束实际上是另一个表中的索引查找。

innodb_flush_logs_at_trx_commit -- 1 有利于数据完整性,但速度较差。 (2 更快)在 BEGIN...COMMIT 事务中放入更多内容(在合理范围内)可以减少“1”的使用。每个事务至少有一个额外的磁盘命中。经验法则:普通磁盘每秒只能处理 100 次点击。

“获取主键”——如果是通过LAST_INSERT_ID()(或等效项)来获取`AUTO_INCREMENT 值,那基本上是免费的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    相关资源
    最近更新 更多