Как я уже сказал, я использовал установку MySQL по умолчанию, никаких настроек или оптимизации). Да, однорядные вставки. Спасибо за ваш ответ, он также дал мне подсказку: я добавил часть транзакции в код VBA, я не знаю, как транзакции DAO транслируются во вставки MySQL, но это имеет большое значение (с InnoDB), средний время вставки 10000 записей уменьшается с 215 до 1,3 секунды! (Дополню свой вопрос)
авляю записи в таблицу 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 SP3Intel Core2 Duo3,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