Mysql:对同一表进行大量数据插入,为何多线程插入比单线程插入快?

http://blog.csdn.net/javastar...
https://www.cnblogs.com/fanwe...

看这些文章,对一同mysql数据库的同一表进行大量数据插入
多线程插入比单线程插入快

我的感觉是,线程对同一个表的写,应该是独占的吧
否则如何检查唯一索引
自增长 id的情况下mysql如何确定主键id?

假如独占
为何多线程插入比单线程插入快?

阅读 19.5k
5 个回答

线程这个用词用在这里可能会产生一些歧义。官方的说法是:操作(operations)。也就是说把【多次的单一词条插入操作】整合成为【一次的多词条插入操作】这个是提高Insert速度的基础。原因很简单,在数据里做插入操作的时候,整体时间的分配是这样的:

  1. 链接耗时 (30%)
  2. 发送query到服务器 (20%)
  3. 解析query (20%)
  4. 插入操作 (10% * 词条数目)
  5. 插入index (10% * Index的数目)
  6. 关闭链接 (10%)

上面的百分比是官方给出的近似比例。从这里可以看出来,真正耗时的不是操作,而是链接,解析的过程,这也就是为什么【多次的单一词条插入操作】的耗时要比 【一次的多词条插入操作】高的根本原因。

官方链接

我的理解是,mysql插入数据在写阶段是独占的,但是插入一条数据仍然需要解析、计算、最后才进行写处理,比如要给每一条记录分配自增id,校验主键唯一键属性,或者其他一些逻辑处理,都是需要计算的,而多线程是利用了多cpu同时计算解析的能力,所以对mysql表来说,只有在最后的写阶段才是独占的,这就节省了大部分时间了

批量插入是个IO密集型的操作,这种类型的一般用多线程都能提升一定的效率,因为a线程插入阻塞的时候,b线程就可以准备数据发起插入请求了,b阻塞的时候,c又可以准备发起请求......
这样流水线操作肯定比一个线程操作快一些啊。
想象一下一个屋子有容纳一个人的进口和出口,有一定量的东西需要从屋外搬到屋内,一个人从入口搬进去再从出口出来这样循环往复快呢?还是一群人排着队流水线搬循环往复快?

多线程只是针对CPU来说的吧,真正的IO还是一样顺序写入的,不可能并发。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题