【问题标题】:Difference in required time to insert InnoDB/MyISAM records插入 InnoDB/MyISAM 记录所需时间的差异
【发布时间】:2011-10-28 18:10:22
【问题描述】:

我正在向 MySQL 表中插入记录,并尝试了解 MyISAM 表和 InnoDB 表之间的时间差异。

这是创建表的代码:

CREATE TABLE SpectrumData (
    ID INT(11) NULL DEFAULT NULL,
    `Set` INT(11) NULL DEFAULT NULL,
    Wavelength DOUBLE NULL DEFAULT NULL,
    Intensity DOUBLE NULL DEFAULT NULL,
    Error INT(11) NULL DEFAULT NULL,
    `Status` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=xxx
ROW_FORMAT=DEFAULT

我插入 10000 条记录,以秒为单位测量所花费的时间,然后重复 100 次。我将结果放在两个 Excel 图表中:

所以 MyISAM 增加而 InnoDB 或多或少保持不变。

谁能解释其中的区别?与表中的记录数有关吗?为什么 InnoDB 会出现这些异常值?

配置使用的电脑:

  • Windows XP SP3
  • 英特尔酷睿2双核
  • 3.00 Ghz
  • 2 GB 内存
  • MySQL 5.5 CE

更新:我应该提到我在 Access 前端应用程序中使用 VBA 脚本插入记录。我通过 ODBC System DSN 连接到 MySQL 数据库。

VBA 代码:

Dim RsSpectrumData As DAO.Recordset
Dim Db As Database
Dim i As Integer
Dim j As Integer
Dim TimerStart

Set Db = CurrentDb
Set RsSpectrumData = Db.OpenRecordset("SpectrumData")

For i = 1 To 100
    TimerStart = Timer
    For j = 1 To 10000
        With RsSpectrumData
            .AddNew
            !Set = 1
            !Wavelength = 100
            !Intensity = 25000
            !Error = 0
            !Status = 0
            .Update
        End With
    Next
    Print #1, Timer - TimerStart
Next

RsSpectrumData.Close

再次更新:

我添加了 DAO 事务功能,现在 10,000 条记录的平均 InnoDB 插入时间从 215 秒减少到平均 1.3 秒! (感谢@MarkR):

Dim RsSpectrumData As DAO.Recordset
Dim Db As Database
Dim Ws As DAO.Workspace
Dim i As Integer
Dim j As Integer
Dim TimerStart

Open "C:\TEMP\logtest.txt" For Append As #1

Set Db = CurrentDb
Set Ws = DBEngine.Workspaces(0)
Set RsSpectrumData = Db.OpenRecordset("SpectrumData")

For i = 1 To 20
    TimerStart = Timer
    Ws.BeginTrans
    For j = 1 To 10000
        With RsSpectrumData
            .AddNew
            !Set = 1
            !Wavelength = 100
            !Intensity = 25000
            !Error = 0
            !Status = 0
            .Update
        End With
    Next
    Ws.CommitTrans
    Print #1, Timer - TimerStart
Next
RsSpectrumData.Close

Close #1

【问题讨论】:

  • +1 你很好地提出了这个问题
  • 1000 条记录不足以得出结论,关于 MyISAM 和 InnoDB、它们如何工作以及何时开始性能下降以及原因已经有很多讨论。尝试插入 10m 条记录,看看会发生什么。
  • serverfault.com/questions/236630/… 似乎找到了相反的结论?
  • @waanders - 如果您正在运行默认的 MySQL 配置,那么是的,完成 10m 条记录需要相当长的时间。 InnoDB 有很多选项来调整它的性能。无论如何,InnoDB 不会立即将数据刷新到磁盘,这与很多事情有关 - 主要是磁盘磁头的旋转和在性能可变的介质上写入的优化。 MyISAM 立即写入磁盘。当数据集增加时,您会发现使用 MyISAM 比使用 InnoDB 更快地恶化。
  • 现在在单个事务中执行所有 InnoDB 插入。

标签: mysql database performance innodb myisam


【解决方案1】:

目前尚不清楚您在 MyISAM 或 Innodb 中启用了哪些持久性设置,也不清楚您是在使用单行插入还是在任何一种情况下使用批量插入。

如果您使用单行插入,您没有使用事务,并且您启用了持久性(InnoDB 中的默认设置),那么您可能会看到 InnoDB 的性能受到提交每个事务的要求的严重限制每行插入后的持久存储(即磁盘)。

MyISAM 没有这样的问题,因为它无论如何都不是持久的,即如果机器崩溃,您或多或少地保证丢失一些数据库先前声称已成功写入的最近写入的数据(如果不是整个表!)。

如果您想要良好的插入性能,请使用批量插入和/或事务,否则您只是在测量写入速度,然后是 fsync(),它(在旋转磁性上的非电池支持 RAID 控制器上)媒体)只是您的光盘旋转的速度。

所以 innodb 如此一致的原因是您正在测量光盘的旋转速度。

话虽如此,如果您有一台繁忙的服务器,那么您肯定、绝对地想要使用电池供电的 RAID 控制器,那么您可以获得不错的事务提交性能和适当的持久性(假设电源故障的时间不超过电池持续,服务器不会爆炸等)。

【讨论】:

  • 如前所述,我使用了默认的 MySQL 安装,没有调整或优化)。是的,单行插入。感谢您的回复,它也给了我一个线索:我在 VBA 代码中添加了一个事务部分,我不知道如何将 DAO 事务转换为 MySQL 插入,但它有很大的不同(使用 InnoDB),平均插入 10,000 条记录的时间从大约 215 秒减少到 1.3 秒! (我会补充我的问题)
【解决方案2】:

要真正看到性能差异,您需要在 DB 上运行一些实际程序。仅仅插入一小批记录并不能说明什么。插入速度在很大程度上取决于列数、索引数量、事务模式、数据库约束和其他正在发生的活动。

【讨论】:

  • 当然,我同意。但我试图(尝试)解释我的特殊情况的差异。只是一个简单的表,没有主键/外键,没有索引,没有自动增量字段,标准 MySQL 安装(没有调整或优化)。只是比较 InnoDB 和 MyISAM,为什么会有这么大的差异?
猜你喜欢
  • 2011-11-05
  • 2013-04-08
  • 2012-04-14
  • 1970-01-01
  • 2011-10-17
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多