• 软件:1160
  • 资讯:41590|
  • 收录网站:97880|

IT精英团

你用了多长时间把100w的数据插入MySQL数据库?

你用了多长时间把100w的数据插入MySQL数据库?

浏览次数:
评论次数:
编辑: 景同
信息来源: ITPUB
更新日期: 2021-06-04 16:30:29
摘要

多线程插入(单表)问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗?答:在数据里做插入操" />

-->
  • 资讯详情

来源| http://juejin.im/post/5d255ab9e51d454f73356dcd

多线程插入(单表)

问:为什么在同一个表中插入多个线程比单线程快?同时给一张桌子写信不应该是独占的吗?答:插入数据时,整体时间分配如下:链接耗时(30%)

向服务器发送查询(20%)

解析查询(20%)

插入操作(10% *条目数)

插入索引(10% *索引索引)

关闭链接(10%)

由此可见,真正需要时间的不是操作,而是链接解析的过程。MySQL插入的数据在写入阶段是独占的,但是插入一段数据还是需要解析、计算,最后写入。例如,为每条记录分配一个自增id,验证主键的唯一键属性,或其他逻辑处理,都需要计算。所以多线程可以提高效率。

多线程插入(多表)

使用多线程在表分区后插入。

预处理SQL

普通SQL,即使用语句接口执行SQL

预处理SQL,即使用PreparedStatement接口执行SQL

使用PreparedStatement接口允许数据库预编译SQL语句,以后只需要传入参数,避免了数据库每次编译SQL语句,性能更好。

string SQL=' insertintotestdb . tuser(名称,备注,createtime,updatetime)值(?)';

for(inti=;im;i ){

//从池中获取连接

connection conn=MyBroker . GetConnection();

preparedstatementsptmt=conn . PrepareStatement(SQL);

for(intk=;kn;k ){

pstmt.setString(1,RanDomToolkit . generate String(12));

pstmt.setString(2,RanDomToolkit . generate String(24));

pstmt.setDate(3,new date(system . CurrentMemillis()));

pstmt.setDate(4,new date(system . CurrentMemillis()));

//加入批处理

pstmt . AddBatch();

}

pstmt . execute batch();//执行批处理

pstmt . close();

my Broker . FreeConnection(conn);//连接属于池

}

多值插入SQL

普通插入SQL: SQL:INSERT INTO TBL_TEST (id)

VALUES(1)
  • 多值插入SQL:INSERT INTO TBL_TEST (id) VALUES (1), (2), (3)
  • 使用多值插入SQL,SQL语句的总长度减少,即减少了网络IO,同时也降低了连接次数,数据库一次SQL解析,能够插入多条数据。

    事务(N条提交一次)

    在一个事务中提交大量INSERT语句可以提高性能。1、将表的存储引擎修改为myisam 2、将 sql 拼接成字符串,每 1000 条左右提交事务。


    /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>mysql数据库
            /// <param name="SQLStringList">多条SQL语句</param>
            public void ExecuteSqlTran(List<string> SQLStringList)
            {
                using (MySqlConnection conn = new MySqlConnection(connectionString))
                {
                    if (DBVariable.flag)
                    {
                        conn.Open();
                        MySqlCommand cmd = new MySqlCommand();
                        cmd.Connection = conn;
                        MySqlTransaction tx = conn.BeginTransaction();
                        cmd.Transaction = tx;
                        try
                        {
                            for (int n = ; n < SQLStringList.Count; n++)
                            {
                                string strsql = SQLStringList[n].ToString();
                                if (strsql.Trim().Length > 1)
                                {
                                    cmd.CommandText = strsql;
                                    cmd.ExecuteNonQuery();
                                }
                                //后来加上的
                                if (n >  && (n % 1000 ==  || n == SQLStringList.Count - 1))
                                {
                                    tx.Commit();
                                    tx = conn.BeginTransaction();
                                }
                            }
                            //tx.Commit();//原来一次性提交
                        }
                        catch (System.Data.SqlClient.SqlException E)
                        {
                            tx.Rollback();
                            throw new Exception(E.Message);
                        }
                    }
                }
            }

    10w条数据大概用时10s!<END>

                                 

    58同城Hadoop2.6升级3.2实践
    « 上一篇
    返回列表
    下一篇 »
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表
    你会是第一个来这里评论的人吗?
    最近发布资讯
    更多