Разница в требуемое время, чтобы вставить 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 resultsInnoDB results

таким образом, MyISAM увеличивается и InnoDB более или менее постоянен.

может кто-нибудь объяснить разницу? Что-то связанное с количеством записей в таблице? И почему эти выбросы с InnoDB?

Конфигурация компьютера:

  • Windows XP SP3
  • Процессор Intel Сердечником2 Дуэт
  • 3.00 Ггц
  • 2 ГБ ОЗУ
  • MySQL 5.5 CE

UPDATE: я должен был упомянуть, что вставляю записи со скриптом VBA в интерфейсное приложение Access. Я подключаюсь к базе данных MySQL с помощью Система ODBC DSN.

код 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:TEMPlogtest.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 ответов


чтобы действительно увидеть различия в производительности, вам нужно будет запустить реальную программу поверх БД. Просто вставка крошечной партии записей не говорит о многом. Скорость вставки зависит от таких вещей, как количество столбцов, количество индексов, шаблон транзакции, ограничения БД и другие действия.


неясно, какие настройки долговечности вы включили в MyISAM или Innodb, а также используете ли вы однорядные вставки или пакетные вставки в любом случае.

Если вы используете однорядные вставки, вы не используете транзакции, и у вас включена долговечность (настройка по умолчанию в InnoDB), то вы, вероятно, увидите, что производительность InnoDB сильно ограничена требованием фиксации каждой транзакции в долговременное хранилище (т. е. диск) после каждой строки вставлять.

MyISAM не имеет такой проблемы, потому что он не долговечен в любом случае, т. е. если машина падает, вы более или менее гарантированно потеряете некоторые недавно написанные данные, которые база данных ранее утверждала, что была написана успешно (если не вся таблица!).

Если вы хотите приличную производительность вставки, используйте пакетные вставки и / или транзакции, иначе вы просто измеряете скорость записи, за которой следует fsync (), который (на контроллере RAID без батареи вращательные магнитные носители) - это просто скорость вращения вашего диска.

поэтому причина innodb настолько последовательна, что вы измеряете скорость вращения вашего диска.

сказав, что, если у вас есть занятый сервер, вы определенно, абсолютно, хотите использовать контроллер RAID с батарейной поддержкой, то вы можете достичь достойной производительности фиксации транзакций и надлежащей долговечности (при условии, что питание не терпит неудачу дольше, чем длится батарея, и сервер не взрывается п.)