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

标签 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 双核
  • 3.00 GHz
  • 2 GB 内存
  • 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 事务功能,现在 InnoDB 插入 10,000 条记录的平均时间从 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

最佳答案

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

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

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

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

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

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

关于mysql - 插入 InnoDB/MyISAM 记录所需时间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090395/

相关文章:

php - MySql表设计: Use lots of rows or store the information formatted in one text field per row?

sql - Access 有时会在保存新记录时跳转到现有记录 - Access2k FE/SQL2005 BE

python - 如何使这个 Python 代码块简短而高效

mysql - 需要帮助将以下 SQL 查询转换为 MySQL 而无需交叉应用方法

mysql - 跟踪 mysql 中内容的 View

.net - 如何使用 .NET 连接到 Informix?

sql - 何时使用 JSON[] 而不是 JSON?

java - 为了循环效率

Android,在列表适配器中有效地加载图像

php - Excel 下载卡住 188kb