Diferencia en el tiempo requerido para insertar registros InnoDB / MyISAM
Estoy insertando registros en una tabla MySQL y trato de comprender las diferencias de tiempo que toma entre una tabla MyISAM y una tabla InnoDB.
Este es el código para crear la tabla:
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
Inserto 10000 registros, mido el tiempo que lleva en segundos y repito esto 100 veces. Puse los resultados en dos gráficos de Excel:
Así que MyISAM aumenta e InnoDB es más o menos constante.
¿Alguien puede explicar las diferencias? ¿Algo relacionado con el número de registros en la tabla? ¿Y por qué estos valores atípicos con InnoDB?
Configuration utiliza computadora:
Windows XP SP3 Intel Core2 Duo 3.00 Ghz 2 GB de RAMMySQL 5.5 CEUPDATE: debería haber mencionado que inserto los registros con un script VBA en una aplicación front-end de Access. Me conecto a la base de datos MySQL mediante un DSN de sistema ODBC.
El código 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
ACTUALIZAR DE NUEVO:
Agregué la funcionalidad de transacción DAO y ahora el tiempo promedio de inserción de InnoDB para 10,000 registros disminuyó de 215 segundos a un promedio de 1.3 segundos! (Gracias a @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