Разница во времени, необходимом для вставки записей 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 ГГц
  • 2 ГБ ОЗУ
  • MySQL 5.5 CE

ОБНОВЛЕНИЕ: Я должен уже упоминали, что я вставляю записи с помощью сценария VBA во внешнее приложение Access. Я подключаюсь к базе данных MySQL через системный DSN ODBC.

Код 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
13
задан waanders 24 April 2012 в 12:59
поделиться