插入InnoDB / MyISAM记录所需时间的差异

时间:2011-08-17 09:14:46

标签: mysql database performance innodb myisam

我将记录插入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 results InnoDB results

所以MyISAM增加和InnoDB或多或少不变。

任何人都可以解释这些差异吗?与表中的记录数量有关?为什么这些异常值与InnoDB一起?

配置二手电脑:

  • Windows XP SP3
  • Intel Core2 Duo
  • 3.00 Ghz
  • 2 GB RAM
  • MySQL 5.5 CE

更新:我应该提到我在Access前端应用程序中插入带有VBA脚本的记录。我通过ODBC系统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

2 个答案:

答案 0 :(得分:2)

目前还不清楚您在MyISAM或Innodb中启用了哪些耐久性设置,也不清楚您是使用单行插入还是批量插入。

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

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

如果你想要不错的插入性能,请使用批量插入和/或交易,否则你只是测量写入的速度,然后是fsync(),这是在非电池备份的RAID控制器上的旋转磁场媒体)只是光盘旋转的速度。

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

话虽如此,如果你有一台忙碌的服务器,你肯定绝对想要使用电池供电的RAID控制器,那么你就可以获得不错的交易提交性能和适当的耐久性(假设电源不会失败超过电池持续,服务器不会爆炸等。)

答案 1 :(得分:1)

要真正看到性能差异,您需要在数据库之上运行一些真正的程序。只插入一小批记录并不多见。插入速度很大程度上取决于列数,索引数量,事务模式,数据库约束和其他活动。