有几十个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分区,有一个三列数据的索引

解决方案 »

  1.   

    表中的数据越多,导入速度当然越慢了。mysql分区表的效率一般都达不到你想象的地步,还是直接分表吧
      

  2.   

    分表现在来不及了,好不容易插入了几十个G,在从头导入太可惜
    我以前用的分表,速度也很慢,
    我有个想法不知是否可行:
    用另一个程序通过命令行调用这个插入程序的exe,每导入一定数量的文件就退出插入程序的exe,然后重新调用?如何避免插入过程中内存越来越少?
      

  3.   

    在导入前关闭索引,导入成功后再打开(不过总体时间差不多)
    修改my.cnf/my.ini中bulk_insert_buffer_size(如果没有就添加在[mysqld]内),=512M或则更大
    可以使用多个进程(不是线程)同时干活
      

  4.   

    我的问题目前已经解决了,方法如下:
    我原来的mysql数据库引擎是innodb 改为myisam,然后把索引先删除了,那个速度的提升,飞一般的感觉,原来导入一个文件(5万行记录)最快30秒,后面直接2分钟了
    用新的方法,一秒钟至少1~2个,导入完成后统一建索引,索引速度居然稍微慢于导入的,但是也比以前快了n倍
    myisam的数据库迁移更方便,直接拷贝。资料上说,myisam适合非事务的应用,检索性能好,我觉得比较适合目前的需求,感谢大家!感谢csdn!