Разница в необходимом времени для вставки записей InnoDB / MyISAM - PullRequest
13 голосов
/ 17 августа 2011

Я вставляю записи в таблицу 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 для 10000 записей сократилось с 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

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

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

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

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

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

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

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

1 голос
/ 17 августа 2011

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

...