Tengo un programa C que extrae una gran fuente de datos (20GB de texto sin formato) y genera cargas de INSERT para ejecutar en una tabla en blanco simple (4 columnas enteras con 1 clave primaria). Configuración como una tabla MEMORY
, la tarea completa se completa en 8 horas. Después de terminar, existen alrededor de 150 millones de filas en la tabla. Ocho horas es un número completamente decente para mí. Este es un trato de una sola vez.Generando una tabla masiva MySQL de 150M
El problema surge al intentar convertir la tabla MEMORY
en MyISAM
para que (A) tenga la memoria liberada para otros procesos y (B) los datos no se eliminen cuando reinicie la computadora.
ALTER TABLE memtable ENGINE = MyISAM
He dejado esta carrera ALTER TABLE
consulta por más de dos días, y no se hace. Ahora lo he matado.
Si creo la tabla inicialmente como MyISAM, la velocidad de escritura parece terriblemente mala (especialmente debido al hecho de que la consulta requiere el uso de la técnica ON DUPLICATE KEY UPDATE
). No puedo apagar las llaves temporalmente. La mesa se haría más de 1000 veces más grande si tuviera que hacerlo y luego tendría que volver a procesar las claves y, básicamente, ejecutar un GROUP BY en 150,000,000,000 filas. Umm no.
Una de las principales limitaciones a tener en cuenta: la consulta INSERT UPDATE registra si la clave principal (un hash) ya existe en la tabla.
Al comienzo de un intento de utilizar estrictamente MyISAM, obtengo una velocidad aproximada de 1.250 filas por segundo. Una vez que el índice crece, me imagino que esta tasa se acumulará aún más.
Tengo 16 GB de memoria instalados en la máquina. ¿Cuál es la mejor forma de generar una tabla masiva que finalmente termine como una tabla MyISAM indexada en disco?
Aclaración: Hay muchas, muchas actualizaciones que van desde la consulta (INSERT ... ON DUPLICATE KEY UPDATE val=val+whatever
). Esto no es, de ninguna manera, un problema de volcado en bruto. Mi razonamiento para probar una tabla MEMORY
en primer lugar era para acelerar todas las búsquedas de índice y cambios de tabla que ocurren para cada INSERT.
InnoDB estaría bien. Esto es muy inteligente ... me gusta. Gracias por lanzarme comentarios. Lo aprecio. :) – brianreavis