4月 29

最近打算做个新站,采集了了2200多万条数据

因为现在VPS是linux的,所以配套使用的是MYSQL,本来想的就是一次性的工作,单条单条插入就可以了

结果吃饭回来发现才插入了800多万条数据,太慢了

记得以前做SQL的时候可以使用SqlBulkCopy批量插入数据,就找了一个可以针对MySQL的

记录如下

 

通常SQL插入语句是这样写的

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
    VALUES ('0', 'userid_0', 'content_0', 0);  
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
    VALUES ('1', 'userid_1', 'content_1', 1);

改写成如下形式

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)   
    VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

这样就可以了.

 

程序改造如下

        //做了分段,每次插入pageSize条数据
        var list = item.Value.ToList();
        int pageSize = 10000;
        int pageTotal = (list.Count % pageSize == 0 ? list.Count / pageSize : list.Count / pageSize + 1);
        for (int pageIndex = 0; pageIndex < pageTotal; pageIndex++)
        {
            var tempList = list.Skip(pageSize * pageIndex).Take(pageSize).ToList<string>();
            NamesDAL.AddNames(tempList, item.Key);
        }

        public static bool AddNames(List<string> infos, string SurnameCode)
        {
            using (IDbConnection connection = new MySqlConnection(Config.ConnectionString))
            {
                StringBuilder sb=new StringBuilder();
                sb.Append("insert into `TB_Names`(`Name`,`SurnameCode`) values"); 
                for (int index = 0; index < infos.Count; index++)
                {
                    sb.AppendFormat("('{0}','{1}'){2}", infos[index],  SurnameCode, (index == infos.Count - 1) ? "" : ",");
                }

                var result = connection.Execute(sb.ToString());
                return result > 0;
            }
        }

当然,单条SQL语句是有上限的,MySQL里面可以使用如下语句查看

show VARIABLES like '%max_allowed_packet%';

更改大小是在 my.ini的[mysqld]段就行配置

max_allowed_packet = 20M

 

written by ocean \\ tags: