¿Cómo puede MyISAM ser "más rápido" que InnoDB si
- MyISAM necesita hacer lecturas de disco para los datos?
- InnoDB usa el grupo de búferes para índices y datos, y MyISAM solo para el índice.
mysql
innodb
myisam
storage-engine
jcho360
fuente
fuente
Respuestas:
La única forma en que MyISAM puede ser más rápido que InnoDB sería bajo esta circunstancia única
MyISAM
Cuando se lee, los índices de una tabla MyISAM se pueden leer una vez desde el archivo .MYI y cargarse en el caché de claves MyISAM (según el tamaño de key_buffer_size ). ¿Cómo puede hacer que una tabla MyISAM .MYD sea más rápida de leer? Con este:
Escribí sobre esto en mis publicaciones anteriores
InnoDB
OK, ¿qué hay de InnoDB? ¿InnoDB realiza alguna E / S de disco para consultas? Sorprendentemente, sí lo hace! Probablemente esté pensando que estoy loco por decir eso, pero es absolutamente cierto, incluso para consultas SELECT . En este punto, probablemente se esté preguntando "¿Cómo está InnoDB haciendo E / S de disco para consultas?"
Todo se remonta a que InnoDB es un motor de almacenamiento transaccional de queja ACID . Para que InnoDB sea Transaccional, debe admitir
I
inACID
, que es Aislamiento. La técnica para mantener el aislamiento de las transacciones se realiza a través de MVCC, Control de concurrencia multiversional . En términos simples, InnoDB registra el aspecto de los datos antes de que las transacciones intenten cambiarlos. ¿Dónde se graba eso? En el archivo de espacio de tabla del sistema, mejor conocido como ibdata1. Eso requiere E / S de disco .COMPARACIÓN
Dado que tanto InnoDB como MyISAM hacen E / S de disco, ¿qué factores aleatorios determinan quién es más rápido?
DELETEs
yUPDATEs
Por lo tanto, en un entorno de lectura pesada, es posible que una tabla MyISAM con un formato de fila fija supere las lecturas de InnoDB del InnoDB Buffer Pool si se escriben suficientes datos en los registros de deshacer contenidos en ibdata1 para admitir el comportamiento transaccional impuesta a los datos de InnoDB.
CONCLUSIÓN
Planifique sus tipos de datos, consultas y motor de almacenamiento con mucho cuidado. Una vez que los datos crecen, puede ser muy difícil mover los datos. Solo pregúntale a Facebook ...
fuente
En un mundo simple, MyISAM es más rápido para lecturas, InnoDB es más rápido para escrituras.
Una vez que comience a introducir lecturas / escrituras mixtas, InnoDB también será más rápido para las lecturas, gracias a su mecanismo de bloqueo de filas.
Escribí una comparación de los motores de almacenamiento MySQL hace unos años, que todavía es verdad hasta el día de hoy, describiendo las diferencias únicas entre MyISAM e InnoDB.
En mi experiencia, debería usar InnoDB para todo excepto para las tablas de caché de lectura pesada, donde la pérdida de datos debido a la corrupción no es tan crítica.
fuente
Para agregar a las respuestas aquí que cubren las diferencias mecánicas entre los dos motores, presento un estudio empírico de comparación de velocidad.
En términos de velocidad pura, no siempre es el caso de que MyISAM sea más rápido que InnoDB, pero en mi experiencia tiende a ser más rápido para entornos de trabajo PURE READ en un factor de aproximadamente 2.0-2.5 veces. Claramente, esto no es apropiado para todos los entornos: como otros han escrito, MyISAM carece de cosas como transacciones y claves foráneas.
He hecho un poco de evaluación comparativa a continuación: he usado python para bucles y la biblioteca timeit para comparaciones de temporización. Por interés, también he incluido el motor de memoria, que proporciona el mejor rendimiento en todos los ámbitos, aunque solo es adecuado para tablas más pequeñas (se encuentra continuamente
The table 'tbl' is full
cuando excede el límite de memoria de MySQL). Los cuatro tipos de selección que miro son:Primero, creé tres tablas usando el siguiente SQL
con 'MyISAM' sustituido por 'InnoDB' y 'memoria' en las tablas segunda y tercera.
1) Vanilla selecciona
Consulta:
SELECT * FROM tbl WHERE index_col = xx
Resultado: empate
La velocidad de estos es, en general, la misma, y como se espera es lineal en el número de columnas que se seleccionarán. InnoDB parece un poco más rápido que MyISAM pero esto es realmente marginal.
Código:
2) cuenta
Consulta:
SELECT count(*) FROM tbl
Resultado: MyISAM gana
Éste demuestra una gran diferencia entre MyISAM e InnoDB: MyISAM (y la memoria) realiza un seguimiento del número de registros en la tabla, por lo que esta transacción es rápida y O (1). La cantidad de tiempo requerida para que InnoDB cuente aumenta de forma superlineal con el tamaño de la tabla en el rango que investigué. Sospecho que muchas de las aceleraciones de las consultas de MyISAM que se observan en la práctica se deben a efectos similares.
Código:
3) selecciones condicionales
Consulta:
SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5
Resultado: MyISAM gana
Aquí, MyISAM y la memoria funcionan aproximadamente igual, y superan a InnoDB en aproximadamente un 50% para tablas más grandes. Este es el tipo de consulta para la cual los beneficios de MyISAM parecen ser maximizados.
Código:
4) Sub-selecciona
Resultado: InnoDB gana
Para esta consulta, creé un conjunto adicional de tablas para la sub-selección. Cada uno es simplemente dos columnas de BIGINT, una con un índice de clave principal y otra sin ningún índice. Debido al gran tamaño de la tabla, no probé el motor de memoria. El comando de creación de la tabla SQL fue
donde una vez más, 'MyISAM' se sustituye por 'InnoDB' en la segunda tabla.
En esta consulta, dejo el tamaño de la tabla de selección en 1000000 y, en cambio, varío el tamaño de las columnas subseleccionadas.
Aquí el InnoDB gana fácilmente. Después de llegar a una tabla de tamaño razonable, ambos motores se escalan linealmente con el tamaño de la sub-selección. El índice acelera el comando MyISAM pero, curiosamente, tiene poco efecto en la velocidad de InnoDB. subSelect.png
Código:
Creo que el mensaje final de todo esto es que si está realmente preocupado por la velocidad, debe comparar las consultas que está haciendo en lugar de hacer suposiciones sobre qué motor será más adecuado.
fuente
SELECT * FROM tbl WHERE index_col = xx
- Aquí hay dos factores que pueden conducir a una mayor variación en el gráfico: clave primaria frente a clave secundaria; El índice está en caché frente a no.SELECT COUNT(*)
es un claro ganador para MyISAM hasta que agregue unaWHERE
cláusula.¿Cual es mas rápido? Cualquiera de los dos podría ser más rápido. YMMV.
¿Cuál deberías usar? InnoDB - a prueba de choques, etc., etc.
fuente