Antes de decidirse por MyISAM o InnoDB, tendrá que revisar ambos motores de almacenamiento en términos de cómo cada caché
MyISAM
Cuando se lee, los índices de una tabla MyISAM se pueden leer una vez desde el archivo .MYI y cargarse en la 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:
ALTER TABLE mytable ROW_FORMAT=Fixed;
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
in ACID
, 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?
- Tamaño de columnas
- Formato de columna
- Conjuntos de caracteres
- Rango de valores numéricos (que requieren INT suficientemente grandes)
- Filas que se dividen en bloques (encadenamiento de filas)
- Fragmentación de datos causada por
DELETEs
yUPDATEs
- Tamaño de la clave principal (InnoDB tiene un índice agrupado, que requiere dos búsquedas de clave)
- Tamaño de las entradas de índice
- la lista continua...
EPÍLOGO
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 soportar el comportamiento transaccional impuesta a los datos de InnoDB. 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.
Por cierto, escribí algo como esto hace 5 días: ¿Cómo asigno un límite de memoria para mySQL?