En primer lugar, su prueba no es válida, ya que el aumento de la velocidad de bloqueo de filas contra bloqueo a nivel de tabla viene cuando hay concurrencia! Con solo 1 inserciones de fabricación de hilo, tiene 1 bloqueo/desbloqueo por inserción en ambos casos, y las inserciones no esperan que se suelte el bloqueo de nivel de tabla.
Segundos, según lo declarado por JIStone, la clave primaria no secuencial es el asesino de rendimiento para las inserciones, cuando el tamaño de la tabla es más grande que el grupo de búferes.
En tercer lugar, el tamaño del grupo de búferes es uno de los ajustes más importantes en InnoDB. Haga lo más posible (la configuración recomendada es 80% de la RAM disponible).
A continuación, según lo indicado por @wallyk, innodb_flush_log_at_trx_commit tiene un papel crucial para la velocidad de las operaciones de E/S.
A continuación, son importantes el innodb_log_file_size y el innodb_buffer_file_size.
A continuación, tenga en cuenta que, dado que tiene 2 índices únicos, antes de que InnoDB pueda insertar la fila, debe verificar la existencia del valor en los índices, y sus índices son grandes.
Sin tener detalles sobre la tabla y los índices, no puedo darle más consejos, pero tenga en cuenta que ningún motor de almacenamiento es una panacea, y aunque a menudo puede ganar mucha velocidad simplemente cambiando el motor de almacenamiento, agregando índice, o ajustando una variable, en sistemas a gran escala las cosas son más complejas que esto. Pero, como dije, no debe comparar la velocidad de la inserción bruta en una prueba aislada, debe realizar la prueba lo más cerca posible de la aplicación real.
actualización: un consejo más En MyISAM e InnoDB, multi-insert (insertar en los valores .... (...), (...), (...)) es más rápido. Además, en InnoDB puede hacer insertos en la transacción, lo que desactiva la actualización de índices no exclusivos antes de que finalice la transacción, y también es más rápido (pero no realiza grandes transacciones, ya que esto realmente ralentizará el nivel de aislamiento utilizado y la forma en que funciona el versionado de filas).
¿Puede mostrarnos los índices? Esa es la causa más probable de tiempos largos de inserción. – wallyk
Tengo 2 índices, data_id que es clave principal y user_id que no es único. Mis insertos son de ~ 150 filas juntas que tienen el mismo user_id (que tiene un índice). – normalppl
, pero ¿cuál es el contenido de cada índice? Si hay un montón de blobs, entonces seguro, será difícil de indexar. Pero si son enteros u otros tipos triviales, entonces es más difícil entender por qué el rendimiento sería malo. – wallyk