【发布时间】: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