2009-10-19 10 views
6

Estoy en el proceso de agregar una nueva característica a un sistema. El proceso leerá datos en vivo de los PLC y los almacenará en una base de datos. La tabla de datos tendrá 4 columnas: variable_id (SMALLINT), marca de tiempo (TIMESTAMP), valor (FLOAT), calidad (TINYINT). La clave primaria es (variable_id, marca de tiempo).¿Cuál es el mejor formato de tabla mysql para alta carga de inserción?

El sistema necesita ser capaz de insertar 1000-2000 registros por segundo.

La tabla de datos mantendrá las últimas 24 horas de datos, los datos más antiguos se eliminarán de la tabla.

La tabla de datos también necesita manejar 5-10 instrucciones de selección cada segundo. La instrucción select selecciona el último valor de la tabla para una variable específica y lo muestra en la web.

¿Debo usar el formato de tabla MyISAM o InnoDB? ¿MyISAM bloquea toda la tabla mientras hace inserciones, bloqueando así las instrucciones de selección de la interfaz web? Actualmente, todas las tablas de datos en la base de datos son tablas MyISAM.

Respuesta

6

¿Debo usar el formato de tabla MyISAM o InnoDB?

Para cualquier proyecto con frecuencia concurrente de lectura y escritura, se debe utilizar InnoDB.

¿MyISAM bloquea toda la tabla mientras se hacen inserciones, bloqueando así las instrucciones de selección de la interfaz web?

Con @@concurrent_insert habilitado, MyISAM puede anexar filas insertadas hasta el final sin dejar de leer simultáneamente desde otra sesión.

Sin embargo, si alguna vez tiene algo diferente al INSERT, esto puede fallar (es decir, la mesa se bloqueará).

El sistema necesita poder insertar 1000-2000 registros cada segundo.

Será mejor mezclar estos insertos y hacerlos en lotes.

InnoDB es mucho más rápido en términos de filas por segundo que en transacciones por segundo.

La tabla de datos mantendrá las últimas 24 horas de datos, los datos más antiguos se eliminarán de la tabla.

Tenga en cuenta que InnoDB bloquea todas las filas examinadas, no solo las afectadas.

Si su estado de DELETE volverá a utilizar un FullScan, el concurrente INSERTs se producirá un error (ya que el FullScan hará InnoDB para colocar las cerraduras paso estrecho en todos los registros navegado incluyendo el último).

+0

Buena respuesta. +1 para ti. –

2

MyISAM es más rápido y bloquea toda la tabla. InnoDB se basa en transacciones, por lo que hará el bloqueo de filas, pero es más lento.

+1

FWIW, he tenido un gran rendimiento de InnoDB, pero MyISAM es mucho, mucho más rápido. Se salen con la suya porque desactivan muchos de los controles que hace InnoDB. –

+0

Gracias por su respuesta. Con MyISAM cuando estoy insertando registros, ¿la tabla está bloqueada para las declaraciones seleccionadas? Por ejemplo, si una instrucción de inserción tarda 5 segundos en finalizar (solo un número aleatorio), ¿la instrucción de selección debe esperar 5 segundos hasta que devuelva el resultado? – thoraniann

+0

Creo que Quassnoi responde esa pregunta: verifique el bit sobre @@ concurrent_insert. –

Cuestiones relacionadas