2012-03-16 14 views
5

Tengo una tabla con 17 millones de filas. Necesito tomar 1 columna de esa tabla e insertarla en otra mesa. Esto es lo que hice:mysql innodb vs myisam inserciones

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001 

InnoDB ejecuta en torno a 3 minutos y 45 segundos

Sin embargo, MyISAM se ejecuta en justo debajo de 4 segundos. ¿Por qué la diferencia?

Veo que todos elogian a InnoDB pero, sinceramente, no veo cómo es mejor para mí. Es mucho más lento. Entiendo que es excelente para la integridad y otras cosas, pero muchas de mis tablas no se actualizarán (solo lea). ¿Debo molestarme con InnoDB?

+0

solamente utilizo InnoDB cuando estoy trabajando con tablas relacionales. De lo contrario, si no tiene ninguna clave externa, MyISAM es lo que prefiero. –

+0

solo para señalar, hay un índice en ambas tablas. la tabla "principal" es actualmente myisam. – nick

+0

ben, me gustaría usar tablas relacionales, pero trataré con posiblemente cientos de millones de filas; también necesito indexar docenas de columnas, así que no sé en qué dirección ir. la integridad no es un gran problema. no para esta parte al menos. – nick

Respuesta

12

La diferencia probablemente se deba a la configuración de innoDB, que requiere un ajuste un poco mayor que myISAM. La idea de innoDB es mantener la mayoría de sus datos en la memoria, y limpiar/leer en el disco solo cuando tiene unos pocos ciclos de CPU de repuesto.

si te molestas con InnoDB es una muy buena pregunta. Si vas a seguir utilizando MySQL, es muy recomendable que obtengas algo de experiencia con InnoDB. Pero si está haciendo un trabajo rápido y sucio para una base de datos que no verá mucho tráfico y no le preocupa la escala, entonces la facilidad de MyISAM puede ser una gran ventaja para usted. InnoDB puede ser excesivo en muchos casos donde alguien simplemente quiere una base de datos simple.

pero muchos de mis cuadros no se actualizará

Todavía se puede conseguir una elevación del rendimiento de InnoDB si usted está haciendo la lectura% 99. Si configura el tamaño de su grupo de búferes para mantener su base de datos completa en la memoria, InnoDB NUNCA tendrá que ir al disco para obtener sus datos, incluso si pierde el caché de consultas de MySQL. En MyISAM, existe una buena posibilidad de que tenga que leer la fila del disco y abandone el sistema operativo para realizar el almacenamiento en caché y la optimización.

innodb-buffer-piscina de tamaño

Mi primera suposición es comprobar innodb_buffer_pool_size que se distribuye fuera de la caja ajustado a 8M. Se recomienda tener esto alrededor del 80% de su memoria total. Una vez que llegue a ese límite, el rendimiento de InnoDB se reducirá de manera significativa debido a que necesita para eliminar algo de la memoria intermedia para dejar espacio a los nuevos datos, que pueden ser costosos

confirmación automática = 0
Además, asegúrese de confirmación automática está se apaga mientras carga su mesa, o se producirá un enrojecimiento en cada inserción. Puedes volver a encenderlo cuando hayas terminado, y es una configuración del lado del cliente. muy seguro.

Cargando tablas normalmente ocurre una vez
pensar si realmente desea optimizar su base de datos para dar cabida a "la inserción de 17 millones de filas". ¿Con qué frecuencia haces esto? MyISAM puede ser más rápido en este caso, pero cuando tiene 100 conexiones simultáneas todas leyendo y modificando esta tabla al mismo tiempo, encontrará que innoDB bien afinado ganará y MyISAM se bloqueará en los bloqueos de la mesa.

Cómo MyISAM ve esta operación
MyISAM va a ser muy bueno en esto sin ningún tipo de puesta a punto, ya que bajo las mantas, usted es simplemente añadiendo cada fila en un archivo (y la actualización de un índice). Su sistema operativo y el almacenamiento en caché de disco manejarán todos esos problemas de rendimiento.

Cómo InnoDB ve esta operación
innodb sabrá la tabla necesita una escritura, por lo que lanza la fila en el buffer de inserciones. No le da tiempo antes de la próxima inserción, por lo que innoDB no tiene tiempo para tratar con el búfer, se queda sin espacio y se ve obligado a 'mantener' la inserción mientras escribe en el grupo de búferes y actualiza los índices. A continuación, su grupo de búferes se llena, e innoDB se ve obligado a 'mantener' la inserción y eliminar algunas páginas del grupo de búferes en el disco. Y sigues tirando inserciones como loco. Tenga en cuenta que cuando sintonice InnoDB para darle un prompt de MySQL> muy rápido después de hacer esto, InnoDB seguirá luchando por debajo de las cobijas para ponerse al día en su tiempo libre, pero estará dispuesto a ejecutar una nueva transacción para usted.

debe decir:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html (ver Consejos para cargar datos en bloque)

+0

Por favor, cualquier experto en rendimiento de MySQL (especialmente de Percona) puede corregirme si me equivoco o si omito algo. Actualizaré la respuesta. – FlipMcF

+0

Un poco inexacto con "llegar a un límite en innodb-buffer-pool-size" Flushing está realmente relacionado con pulsar "innodb_max_dirty_pages_pct". Pero eso es dividir los pelos para esta pregunta, supongo. – FlipMcF

+0

También una buena lectura para usted: http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would- take/ – FlipMcF

1

que estás diciendo justo hasta cierto punto. InnoDB es más lento que MyISAM, pero ¿en qué casos? Todo no está hecho para cumplir con los requisitos de todos. INNODB es un motor de base de datos transaccional, mientras que MyISAM no lo es. Por lo tanto, para convertirlo en el motor de almacenamiento de conformidad y transacciones de ACID, debemos pagar su costo en términos de tiempo de respuesta.

Más información InnoDB se ejecuta más rápido si se ajusta correctamente utilizando my.ini u otro archivo de configuración.

Al final soy capaz de comprender las siguientes razones por las cuales las personas están alabando InnoDB:

  1. Es compatible con ACID y motor de transacciones apoyado
  2. Se toman el bloqueo de filas mientras se trabaja en una mesa mientras MyISAM cerraduras tomar a nivel de tabla
  3. InnoDB es altamente ajustable para máquinas/multi-proceso multi-core para mejorar la concurrencia

por último, pero no menos importante de mi comentario lado; cualquier cosa puede satisfacer las necesidades de "todos", por lo que depende únicamente de en qué situación esté comparando ambos motores.

Cuestiones relacionadas