MyISAM para lecturas de datos

10

Tengo una tabla con alrededor de 1 mil millones de filas, y su lectura intensiva en un 98%.

Intenté ajustar la base de datos, con diferentes motores de almacenamiento (MyISAM e InnoDB)

Luego ejecuté algunas pruebas para ver el rendimiento

En la cláusula where, tenía una ID de clave principal, y parecía que dado que MyISAM Key Cache almacena todo el índice en su búfer, usar MyISAM parecía ser bastante rápido, alrededor de 2 veces más rápido que InnoDB

¡Pero para InnoDB, parecía más lento! ¿Es que InnoDB no utiliza ningún búfer para precargar los índices?

Akash
fuente
¿Quizás alguno de los gatillos contentos que votaron para cerrar la pregunta puede explicar sus motivaciones?
pQd
¿Puede darnos una idea del tamaño de la base de datos y la tabla en cuestión? El tamaño total en el disco sería útil. Además, ¿qué especificaciones tiene la máquina en la que está ejecutando?
Dave Rix

Respuestas:

6

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 Iin 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 DELETEsyUPDATEs
  • 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?

RolandoMySQLDBA
fuente
¿innodbe realmente genera lecturas de disco cuando todos los datos ya están en el grupo de búferes y no hay solicitudes de modificación de datos concurrentes, solo lecturas?
pQd
Supongo que, dado que el autor de la pregunta tiene mil millones de filas en su base de datos, es poco probable que tenga todo en caché en la memoria RAM en el grupo de búferes; por lo tanto, ¿se necesitarán lecturas para acceder a los datos fuera del grupo de búferes y en el disco?
Dave Rix
3

MyISAM siempre se ejecutará mucho más rápido que innodb cuando no haya contención para los datos. Comience a agregar varias sesiones tratando de actualizar el mismo tablse, e innodb obtiene rápidamente la ventaja de rendimiento.

La forma en que ajusta el sistema para los 2 motores es muy diferente.

La razón por la que existen diferentes motores es porque existen diferentes cargas de trabajo / patrones de acceso.

symcbean
fuente
2

tienes que 'calentar' innodb. por ejemplo, reproduciendo registros de acceso o ejecutando algunas consultas inteligentes que tocarán cada valor del índice.

Echa un vistazo aquí o aquí .

Espero que no use la configuración predeterminada de mysql para innodb: fueron adecuados para hardware desde ~ 2000.

pQd
fuente
Realicé cambios en la configuración predeterminada, también ejecuté la consulta varias veces, alrededor de 30 veces, pero produje casi los mismos resultados. Fue más rápido después de algunos intentos, pero se mantuvo más lento que MYISAM, también usó MariaDB (última versión)
Akash
0

Después de ajustar aún más InnoDB en MariaDB, innodb_buffer_pool_sizeaumenté el tamaño de mi base de datos InnoDB, ya que al hacerlo, InnoDB comenzó a buscar filas más rápido

Supongo que ajustar InnoDB es bastante importante de acuerdo con las necesidades de su base de datos

Akash
fuente