PDA

Ver la Versión Completa : Inserción masiva en MySQL


Morfo
09-01-2004, 07:02:33
Hola soy nuevo en este foro pero llevo tiempo visitando este sitio y me inicio aqui con lo siguiente:

Estoy haciendo(pues no lo considero terminado) un programa en delphi 7 con M$Access y MySQL el cual exporta datos de access a MySQL.
Lo que lo hace particular es que tengo que formatear determinados campos al tipo de mysql(fechas sobre todo) y por tal motivo no es una exportación tan cruda como yo quisiera.
Total que he realize un procedimiento el cual extrae la información de access y la inserto en MySQL por medio de instrucciones SQL para MySQL por cada registro en access.
Platicando con mi hermano me comento que esto si bien funciona no es el mejor camino (ni practico) ya que me comentó acerca de los parametros que puedo usar con DBExpress para construir mi consulta una sola vez y por medio de los parametros irlos cambiando dinamicamente dentro del loop que extrae los datos de access lo que (según me dijo, lo siento aún no lo compruebo) es más rápido el rendimiento.


No hay pregunta en mi tema pero si tengo muchas dudas ya que al momento de tratar de asignar un valor al parámetro no lo recoge y me envia un error como : "No se pude convertir un valor OLEvariant a double" cuando o uso DOUBLE como tipo en ningun campo destino de MySQL.
Quizá el problema radique en que los valores de los parametros los trato de asignar así:

Query1.Params[0].Value:=ADOQuery1.Recordset.Field[0].Value;
Query1.Params[1].Value:=ADOQuery1.Recordset.Field[1].Value;
y así por el estilo.

Ya revise mis campos en MySQL pero no veo ningún impedimento.


Uffff, si bien no me urge sé que puede ser más eficaz mi exportación masiva, actualmente me tardo en exportar cerca de un millon de registros en una hora y tengo la seguridad de que podría hacerlo más rápido.

Bueno, les agradezco la atención.
Saludos.

Morfo
09-01-2004, 16:29:39
Pues bien mis estimados amigos.

Logré hacer funcionar el anterior método que estaba aplicando.

Aparentemente tenía que hacer un Flush a las tablas a antes de proceder a mi carga, cosa rara pero al fin funcionó pero con un punto a considerar muy importante.

Un campo en mi tabla de MySQL del tipo varchar al cual le inserto un numero telefónico de 8 digitos(grave error) mi programa en delphi los insertaba bajo el siguiente formato "00000000.00000000", revise nuevamente las bases de datos de access y me percate de que no había tal formato por lo que para evitar complicarme un rato más en ese asunto cambie el tipo de dato a mi campo de MySQL a entero(int) y listo, se solucionó el detalle.

Sin embargo comprobé que no había gran diferencia entre envíar la cadena de consulta a MySQL que hacer la consulta mediante parametros en cuanto a tiempo y rendimiento se refiere. La diferencia era marginal si es que existía.

Esto a pesar de que lo intente de muchas formas.
Anteriormente creaba archivos de texto con extension SQL para cargarlos directamente al servidor lo cual es tremendamente rápido en comparación a como hoy lo hago sin embargo tengo el problema de espacio, el cual se duplicaba de acuerdo al numero de bases de datos de access las cuales suman más de 5,000.

Ahora que lo pienso voy a intentar despúes la instrucción de MySQL "LOAD FILE IN" el cual , según la documentación, es muy rápido, pienso crear el archivo plano de forma temporal por cada base de datos acccess y eliminarlo una vez cargado. Suena bien ya les comentaré.

Pienso dejarlo así,puesto que este programa sólo es parte más de un procesos mucho más grande que incluye programación en LAMP(Linux,Apache,MySQL y PHP).




Ahh pero cabe aclara a todos mis amigos que este programa es muchisimo más rápido de lo que podría hacerlo visual basic o VB.NET, la comparación es injusta lo sé pero tenía el cargo de conciencia de hacerlo.

Saludos.

roman
09-01-2004, 18:21:06
Morfo comentó:
Sin embargo comprobé que no había gran diferencia entre envíar la cadena de consulta a MySQL que hacer la consulta mediante parametros en cuanto a tiempo y rendimiento se refiere. La diferencia era marginal si es que existía.


Esto es porque al menos hasta la versión 3.2x mysql no soporta consultas preparadas. No recuerdo ahora si la última versión ya lo hace, en cuyo caso lo que hay que hacer es usar la propiedad Prepared o similar del objeto Query.

// Saludos

Morfo
09-01-2004, 19:05:33
Ignoro si MySQL este habilitado para consultas preparadas, sin embargo cuando trataba de preparar la consulta con PREPARED delphi me informaba de un error "No se puede usar esa instruccion en una conexion abierta"o algo similar, por lo que abandoné esa instruccion.

Seguramente es por lo que comentas.

Saludos.