有几十个G的数据需要导入mysql,c#循环调用如下方法直接从文件导入,每个load的文件都有5万行数据记录;现在有个问题,从日志看,程序刚开始运行时,导入一个文件30秒左右,随着程序运行时间的增加,导入时间逐渐延长至1分钟以上,我觉得太慢,就退出重新运行程序,也是刚开始快点,后面逐渐变慢;另外我发现随着数据库已有数据的逐渐增大,导入新文件的速度也会变慢,现在的导入效率还是太低了,请问各位高手,我如何从程序优化和数据库优化的角度去提高导入速度?非常感谢!导入代码如下: public int loadFile(string fileName)
{ MySqlConnection conn = new MySqlConnection(conStr);
conn.Open();
int flag = 0;
try
{
string infoQuery = "load data infile '" + fileName + "' into table tablename(name, value1, value2, value3);";
MySqlCommand cmd = new MySqlCommand(infoQuery, conn); cmd.CommandTimeout = 1000;
cmd.ExecuteNonQuery();
flag = 1;
}
catch (InvalidCastException e)
{
logger.logRecord("Load err: " + fileName);
} conn.Close();
return flag;
}我建立的数据表tablename,分了10个rang分区,有一个三列数据的索引
{ MySqlConnection conn = new MySqlConnection(conStr);
conn.Open();
int flag = 0;
try
{
string infoQuery = "load data infile '" + fileName + "' into table tablename(name, value1, value2, value3);";
MySqlCommand cmd = new MySqlCommand(infoQuery, conn); cmd.CommandTimeout = 1000;
cmd.ExecuteNonQuery();
flag = 1;
}
catch (InvalidCastException e)
{
logger.logRecord("Load err: " + fileName);
} conn.Close();
return flag;
}我建立的数据表tablename,分了10个rang分区,有一个三列数据的索引
我以前用的分表,速度也很慢,
我有个想法不知是否可行:
用另一个程序通过命令行调用这个插入程序的exe,每导入一定数量的文件就退出插入程序的exe,然后重新调用?如何避免插入过程中内存越来越少?
修改my.cnf/my.ini中bulk_insert_buffer_size(如果没有就添加在[mysqld]内),=512M或则更大
可以使用多个进程(不是线程)同时干活
我原来的mysql数据库引擎是innodb 改为myisam,然后把索引先删除了,那个速度的提升,飞一般的感觉,原来导入一个文件(5万行记录)最快30秒,后面直接2分钟了
用新的方法,一秒钟至少1~2个,导入完成后统一建索引,索引速度居然稍微慢于导入的,但是也比以前快了n倍
myisam的数据库迁移更方便,直接拷贝。资料上说,myisam适合非事务的应用,检索性能好,我觉得比较适合目前的需求,感谢大家!感谢csdn!