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

waa*_*ers 13 mysql database performance myisam innodb

我将记录插入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
Run Code Online (Sandbox Code Playgroud)

我插入10000条记录,以秒为单位测量所需时间并重复100次.我把结果放在两个Excel图表中:

MyISAM结果 InnoDB结果

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

谁能解释这些差异?与表中的记录数量有关?为什么这些异常值与InnoDB?

配置二手电脑:

  • Windows XP SP3
  • 英特尔酷睿2双核处理器
  • 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
Run Code Online (Sandbox Code Playgroud)

再次更新:

我添加了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
Run Code Online (Sandbox Code Playgroud)

Zds*_*Zds 1

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