【问题标题】:Are Concurrent SQL inserts into the same table transactionally safe?并发 SQL 插入同一个表在事务上是安全的吗?
【发布时间】:2009-02-05 08:07:31
【问题描述】:

我在 MySql 中有一个简单的表,它的存在理由是存储日志。 该表具有自动递增序列,并且所有其他列对其他表的引用完整性为零。任何列上都没有唯一键或索引。自增列为主键。

并发 INSERT 是否会相互干扰?我将干扰定义为丢失数据。

我为此插入使用 autocommit=true。

【问题讨论】:

  • 您将使用哪个存储引擎?
  • 我认为如果它适用于 MyISAM,它应该适用于 Innodb :)

标签: mysql database concurrency


【解决方案1】:

您永远不会因为同时插入而丢失数据。如果您使用交易,您可能会“丢失”一些 ID,但不会丢失实际数据。 (想象一下,您启动一​​个事务,插入几行,然后进行回滚。InnoDB 将分配 auto_increment ID,但没有具有这些 ID 的行,因为您进行了回滚)。

由于您不需要索引,您应该看看 ARCHIVE 表引擎。它的速度快得惊人——而且您的表变得更小,这反过来又使您稍后读取表时扫描表的速度快得多。

【讨论】:

  • 我体验过归档表引擎比其他引擎慢得多,尤其是在过滤值时,因为引擎中不支持索引...
  • Cassy - 是的,确实如此。如果您可以有效地使用索引,那么带有索引的表类型会更快。但通常你不能;归档表的全扫描速度尽可能快。然后,您将“按需”表扫描相关数据到一个汇总表(带有索引)并查询那个。
【解决方案2】:

来自MyISAM storage engine 的 MySQL 手册:

"MyISAM supports concurrent inserts..."

【讨论】:

  • +1 在我们两个之间,我想这个问题现在已经解决了:)
【解决方案3】:

是的。对于 InnoDB ,更多信息here

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 2010-09-07
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多